Shell脚本没有通过crontab运行,但手动运行正常

时间:2013-12-14 10:38:17

标签: bash shell

我有一个脚本检查pptp vpn是否正在运行,如果不是,它会重新连接pptp vpn,当我手动运行脚本时它执行正常,当我设置一个cron作业时,没有运行

* * * * * /bin/bash /var/scripts/vpn-check.sh

脚本来了:

#!/bin/sh
/bin/ping -c3 192.168.17.27 > /tmp/pingreport
result=`grep "0 received" /tmp/pingreport`
truncresult="`echo "$result" | sed 's/^\(.................................\).*$$'`"
if [[ $truncresult == "3 packets transmitted, 0 received" ]]; then
/usr/sbin/pppd call home
fi

10 个答案:

答案 0 :(得分:8)

最后我找到了一个解决方案......而不是用

输入cronjob
crontab -e

我需要直接编辑crontab文件

nano /etc/crontab

添加例如

之类的东西
*/5 *     * * *   root  /bin/bash /var/scripts/vpn-check.sh

现在很好!

谢谢大家的帮助......希望我的解决方案能帮助其他人。

答案 1 :(得分:2)

您的脚本可以像这样更正和简化:

#!/bin/sh
log=/tmp/vpn-check.log
{ date; ping -c3 192.168.17.27; } > $log
if grep -q '0 received' $log; then
    /usr/sbin/pppd call home >>$log 2>&1
fi

通过我们在评论中的讨论,我们确认脚本本身有效,但pppdcron运行时没有。这是因为在终端窗口和cron等交互式shell中,某些内容必须不同。顺便说一下,这种问题很常见。

首先要做的是尝试记住pppd所需的配置。我不使用它,所以我不知道。也许你需要设置一些环境变量?在这种情况下,很可能你在启动文件中设置了一些东西,比如.bashrc,它通常不在非交互式shell中使用,并且可以解释为什么pppd不起作用。

第二件事是检查pppd的日志。如果您无法轻松找到日志,请查看其man页面及其配置文件,并尝试查找日志或如何进行日志记录。根据日志,您应该能够找到在cron中运行时遗漏的内容,并解决您的问题。

答案 2 :(得分:1)

如果您肯定脚本在cron之外运行,请执行

printf "SHELL=$SHELL\nPATH=$PATH\n* * * * * /bin/bash /var/scripts/vpn-check.sh\n"

对于您正在使用的crontab,请执行crontab -e,并将其替换为上述命令的输出。如果存在某些丢失的路径问题或其他问题,这应该反映您的大部分环境。还要检查日志中是否有任何错误。

虽然它肯定看起来像脚本有错误,或者你在这里复制时搞砸了什么

sed: -e expression #1, char 44: unterminated `s' command
./bad.sh: 5: ./bad.sh: [[: not found

简单的替代脚本

#!/bin/bash

if [[ $(ping -c3 192.168.17.27) == *"0 received"* ]]; then
  /usr/sbin/pppd call home
fi

答案 3 :(得分:1)

很长一段时间以来出现错误,我只是这样做:

SHELL=/bin/bash 
PATH=/bin:/sbin:/usr/bin:/usr/sbin
* * * * * /bin/bash /home/joaovitordeon/Documentos/test.sh

test.sh包含:

#!/bin/bash 

/usr/bin/python3  /home/joaovitordeon/Documentos/test.py; 

答案 4 :(得分:0)

作为其他答案的补充,您是否忘记了crontab脚本中的用户名?

试试这个:

* * * * * root /bin/bash /var/scripts/vpn-check.sh

修改

以下是您的代码补丁

#!/bin/sh
/bin/ping -c3 192.168.17.27  > /tmp/pingreport
result=`grep "0 received" /tmp/pingreport`
truncresult=`echo "$result" | /bin/sed 's/^\(.................................\).*$/\1/'`
if [[ $truncresult == "3 packets transmitted, 0 received" ]]; then
    /usr/sbin/pppd call home
fi

答案 5 :(得分:0)

尝试一下   / home /您的站点文件夹名称/public_html/gistfile1.sh 像上面一样设置cron路径

答案 6 :(得分:0)

在将sh放在crontab中的命令之前时,也解决了类似的问题

这不起作用:

@reboot ~myhome/mycommand >/tmp/logfile 2>&1

这样做:

@reboot sh ~myhome/mycommand >/tmp/logfile 2>&1

答案 7 :(得分:0)

就我而言,问题是该脚本未标记为可执行文件。要确保它是,请运行以下命令:

chmod +x your_script.sh

答案 8 :(得分:0)

问题陈述是在 shell 中手动运行时脚本正在执行,但是当通过 cron 运行时,它给出了“java: command not found”错误 -

请尝试以下 2 个选项,它应该可以解决问题 -

  1. 确保脚本是可执行的。如果不是,请在下面执行 - chmod a+x your_script_name.sh

  2. cron 作业与您手动执行脚本的用户不同 - 因此它无法访问与您的用户相同的 $PATH 变量,这意味着它无法找到Java 可执行文件来执行脚本中的命令。我们应该首先获取 PATH 变量的值,如下所示,然后在脚本中设置(导出)-

echo $PATH 可用于获取 PATH 变量的值。

并且您的脚本可以修改如下 - 请参阅以导出开头的第二行

#!/bin/sh
export PATH=<provide the value of echo $PATH>
/bin/ping -c3 192.168.17.27 > /tmp/pingreport
result=`grep "0 received" /tmp/pingreport`
truncresult="`echo "$result" | sed 's/^\(.................................\).*$$'`"
if [[ $truncresult == "3 packets transmitted, 0 received" ]]; then
/usr/sbin/pppd call home
fi

答案 9 :(得分:0)

首先,检查 cron 服务是否正在运行。您知道 IT 帮助台的第一个问题:“PC 是否已插入?”。