我有一个像这样运行的 crontab:
0 0 * * * /execute/shell/script.sh
0 0 * * * /execute/shell/script1.sh
0 0 * * * /execute/shell/script2.sh
而且,我想在不同的屏幕上启动每个脚本。但我想让该屏幕保持运行,这样每当我想查看其中一个脚本的进度时,我都可以这样做,screen -d -r <PID>
它会重新连接屏幕让我查看进度。
我确信一定有办法做到这一点。但我发现的类似问题都没有回答。
答案1
您是否实际上必须与命令进行交互,或者您只是想在命令完成之前查看状态,然后将结果邮寄给您?
我遇到了类似的“问题”,当时我正在运行traceroute(8)
和mtr
从 cron 内部监控连接,以mtr
循环运行的for
方式在给定间隔(5 到 16.67 分钟(300 到 1000 个周期)之间)提供更精确的测量,但整个脚本设计为运行大约一个小时(以确保我不会收到垃圾邮件),因此,我希望能够看到发生的状态。
道路cron
它的工作原理是在 /tmp 中创建一个临时文件,并立即调用unlink(2)
(但仍保持文件打开);这随后用于在脚本完成之前存储脚本的输出,并通过电子邮件发送给您。
因此,您可以使用lsof -n -c cron
(and/or lsof -n | fgrep cron
) 找出已删除的打开文件的数量,然后通过/proc/$PID/fd/$FD
命名空间访问这些文件,以查看在 cron 中运行的脚本的输出,而无需screen
。
答案2
您可以尝试这样的操作:
cat /etc/cron.d/test
*/10 * * * * root screen -dmS script bash -c '/execute/shell/script.sh; exec bash'
*/10 * * * * root screen -dmS script1 bash -c '/execute/shell/script1.sh; exec bash'
*/10 * * * * root screen -dmS script2 bash -c '/execute/shell/script2.sh; exec bash'
我相信它应该可以工作。当然,您可以根据需要编辑时间。
答案3
上述内容(Jaroslav Kucera 的回答)将无法按预期工作,因为在第二次调用时,命令将产生具有与前一个名称的新屏幕会话。
如果您希望对相同的脚本始终进行相同的屏幕会话,那么我会做得更棘手一些。
我将在 @reboot cron 中使用脚本运行这些会话,这些脚本会不断循环,例如
#!/bin/bash
while true; do
if [ -f /tmp/script1_enabled ]; then
script1_function_or_command
rm /tmp/script1_enabled
fi
sleep 60;
done
它将每分钟运行一次,检查 /tmp 中是否存在命名文件 - 如果存在则运行该命令,否则再等待一分钟。
第二部分是每天创建这些文件的 cron 命令 - 像布尔标志一样工作以启动脚本调用。
脚本完成后,文件将被删除。这样,您可以为脚本保留相同的会话,并仍按您喜欢的间隔运行它。
如果循环中的 60 秒延迟对你来说太多了(无法使用此方法在给定时间精确运行脚本,因为睡眠将在不可预测的时间内执行),那么你可以设置通知等待文件创建后立即监视并执行脚本。
cron 看起来像:
@reboot screen -dmS script1 /usr/local/bin/script1_watcher
@reboot screen -dmS script2 /usr/local/bin/script2_watcher
0 0 * * * touch /tmp/script1_enabled
15 */4 * * * touch /tmp/script2_enabled