我的crontab有几个类似的调用,其中调用脚本时带有羊群文件、超时和输出/错误日志。我想把这个逻辑放入一个共享函数,我只是传递脚本路径和超时长度。是否有办法在crontab中定义一个所有条目都可以使用的函数?
到目前为止,我发现的最好的解决方案是在我的。bashrc文件中定义我的函数,并用bash -ic "..."
包装每个cron命令,使它们在交互式shell中运行,但这似乎有些过分,并且意味着我的crontab的功能链接到我的。bashrc文件。没有更好的方法来使用crontab中的函数吗?
在Ubuntu Server 20.04 LTS上测试
----编辑----
根据评论,下面是我的crontab中的一个示例条目:
0 */4 * * * IFS=; output=$(flock -n /home/me/my_script.lock timeout 3600 python3 /home/me/my_script.py 2>&1 || if [ $? -eq 124 ]; then echo "`date '+%s'`: Killed due to timeout"; fi); if [ "$output" ]; then echo $output; fi >> /home/me/logs/my_script.log 2>&1
…和相应的测试函数我放在我的。bashrc文件
test() {
IFS=;
output=$(flock -n test.lock timeout 300 python3 test.py 2>&1 || if [ $? -eq 124 ]; then echo "`date '+%s'`: Killed due to timeout"; fi);
if [ "$output" ]
then
echo $output
fi
}
…这个函数当然是为了测试而硬编码的,如果使用的话,我会为脚本路径和每个操作的超时长度添加参数。
希望这更好地解释了使用函数的愿望,因为整个IFS, flock, timeout和'kill by'块都被每一行重用(其中有几十个)。是否有更好的解决方案迎合这种需求,欢迎所有建议,否则建议把函数作为一个单独的bash脚本声音合适。
将函数放入文件中,您可以执行
0 * * * * . /path/to/file; func_name arg1 arg2
请注意,crontab的默认shell是/bin/sh。如果您的函数依赖于bash特性,请在crontab中设置SHELL = /bin/bash
。参见man 5 crontab