我有一个脚本检查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
答案 0 :(得分:8)
最后我找到了一个解决方案......而不是用
输入cronjobcrontab -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
通过我们在评论中的讨论,我们确认脚本本身有效,但pppd
在cron
运行时没有。这是因为在终端窗口和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 个选项,它应该可以解决问题 -
确保脚本是可执行的。如果不是,请在下面执行 - chmod a+x your_script_name.sh
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 是否已插入?”。