我有一堆 CronJobs,它们工作得很好,除了一个。我浏览了很多论坛和网站,并尝试了多种方法的组合,但可惜没有任何效果。
重新表述一下问题是:
问:bash脚本在终端上运行没有任何问题。但对于 CronJob 来说它根本不起作用。
我为调试所做的最后一件事如下:
1) 检查 Cron 守护进程是否正在运行 ( ps ax | grep
) =正在工作
2)做了额外的计时工作(重新测试)每分钟向我发送一封电子邮件()=工作正常* * * * * echo "hello" | mail -s "subject" [email protected]
3)我已经通过终端作为独立的bash脚本运行=工作正常
4) 我已经检查了grep CRON /var/log/syslog
是否有任何错误=看起来不错/没有错误
5) 检查权限等=权限没有问题
6) cron 作业的 bash 脚本的文件路径看起来不错
#!/bin/bash
#When adding any additional machines make sure there are two files
#within the directory. MACHINE_NAMEMACHINE_NUMBER_initial_time.txt
#and MACHINE_NAMEMACHINE_NUMBER_old_ignition_value.txt
#./engine_switch_check.txt MACHINE_NAME MACHINE_NUMBER
echo `date +%T` >> test.txt
./engine_switch_check.txt MXE 065
./engine_switch_check.txt TMX5BP 001
./engine_switch_check.txt MX3 122
./engine_switch_check.txt TMX 098
和engine_switch_check.txt:
#!/bin/bash
mc_id="$1" #-->eg: TMX
mc_no="$2" #-->eg: 098
echo "$mc_id $mc_no"
#echo "1--$mc_id$mc_no-DATAFILE.txt"
mc_fname=$mc_id$mc_no'_old_ignition_value.txt'
echo $mc_fname
#old_ignition_value=$(sed -n '1p' $mc_fname)
#echo "2--$old_ignition_value"
#old_ignition_value=$(sed -n '1p' $mc_id$mc_no'DATAFILE.txt')
#echo "3--$old_ignition_value"
new_ignition_value=`get values from the terminal`
old_ignition_value=$(sed -n '1p' $mc_id$mc_no'_old_ignition_value.txt')
echo "Program name: $0"
echo "New Ignition Value: $new_ignition_value"
echo "Old Ignition Value: $old_ignition_value"
echo;echo;echo
#difference_btwn_new_old_ign_values=$(awk '{print $1-$2}' <<< "$new_ignition_value $old_ignition_value")
difference_btwn_new_old_ign_values=$(($new_ignition_value - $old_ignition_value))
#difference_btwn_new_old_ign_values= expr new_ignition_value - old_ignition_value
echo "$new_ignition_value"
echo "$old_ignition_value"
echo "$difference_btwn_new_old_ign_values"
if [ "$difference_btwn_new_old_ign_values" -lt "1" ]
then
> $mc_id$mc_no'_initial_time.txt'
initial_time=`date +"%s"`
echo $initial_time >> $mc_id$mc_no'_initial_time.txt'
fi
if [ "$difference_btwn_new_old_ign_values" -ge "5" ]
then
final_time=`date +"%s"`
initial_time=$(sed -n '1p' $mc_id$mc_no'_initial_time.txt')
echo;echo;echo "initial time: $initial_time"
echo "final time: $final_time"
#initial_time=0000
time_difference_in_sec=$(( $final_time - $initial_time ))
echo "time difference in sec: $time_difference_in_sec"
time_difference_in_min=$(( $time_difference_in_sec / 60 ))
if [ "$time_difference_in_sec" -le "3600" ]
then
email_subject="$mc_id $mc_no switched on $difference_btwn_new_old_ign_values times within $time_difference_in_min minutes"
`echo -e "Hi there,\n\n$mc_id $mc_no has been switched on $difference_btwn_new_old_ign_values times within the last $time_difference_in_min minutes\n\nCheers," | mail -s "$email_subject" $email_list`
echo "EMAIL SENT"
: <<'psuedo'
> $mc_id$mc_no'_old_ignition_value.txt'
echo $new_ignition_value >> $mc_id$mc_no'_old_ignition_value.txt'
psuedo
fi
if [ "$time_difference_in_sec" -gt "3600" ]
then
> $mc_id$mc_no'_initial_time.txt'
initial_time=`date +"%s"`
echo $initial_time >> $mc_id$mc_no'_initial_time.txt'
fi
fi
我已经删除了有关电子邮件的详细信息,但该行工作正常。
老实说,我不知道我还能做什么。该 bash 文件的唯一区别是它从其中调用另一个“可执行 txt”文件。这两个文件本身都可以在终端上很好地工作。
更新(18/02/2015): 我通过编写另一个(更简单的)脚本来通过电子邮件发送时间戳来进一步尝试 CronTab,还将时间戳记录到 .txt 文件中 - 工作没有任何问题。我重写了它,因为我想 CronTab 可能没有像它应该的那样工作。
对于遇到类似问题的任何人,您应该考虑以下一些选择: 我在故障排除过程中所做的其他事情(排名不分先后)
- 创建一个文本文件的回显以查看程序是否正在运行
- 避免使用 sudo crontab -e每个人都建议远离 sudo crontab -e
- 检查 crontab 中的目录路径
- 阅读/重读各种论坛,一遍又一遍地阅读/重读我的程序(让其他懂编程的人来做这件事,因为新的眼睛可以看到你可能错过的东西)
- 将 PATH 和 SHELL 添加到 crontab 中
- 添加了不同的 CronJobs(提到更新 18/02/15)
- 将所有程序中的相对路径更改为完整路径这使得它可以与 crontab 一起使用
答案1
我认为你需要在脚本中设置路径变量
例如
PATH='/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin'
答案2
$PATH
正如其他人所建议的那样,在可以从交互环境外部调用的脚本中设置始终是一个很好的做法。
当您从 shell 调用脚本时,您可能cd
首先访问包含的目录。您还需要在这里执行此操作。
cron
例如,可能会使用/
或的工作目录运行脚本,因此您需要使用 之外的程序的完整路径,或者更改为正确的工作目录。在这种情况下,您将需要更改工作目录,因为脚本会写入磁盘,并且您似乎希望输出文件与脚本驻留在同一目录中。/var
$PATH
您可以更改 crontab 条目中的目录:
* * * * * cd /home/ed/enginecheck && ./engine.txt
或者在脚本本身中(在任何其他命令之前):
cd /home/ed/enginecheck
echo `date +%T` >> test.txt
...
答案3
对我有用的解决方案是我改变了全部我的两个程序中的路径相对的路径即:( ./name_of_file.txt
) 到满的路径(即/home/ed/directory/some_more_directory/name_of_file.txt
:)
我不知道这只是这个,还是我所做的其他事情的组合 - 但将路径从相对路径更改为完整路径就做到了。