如何使用crontab中的函数



我的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

相关内容

  • 没有找到相关文章