我有一个这样运行的crontab:
0 0 * * * /execute/shell/script.sh 0 0 * * * /execute/shell/script1.sh 0 0 * * * /execute/shell/script2.sh
而且,我想在不同的屏幕上启动每个脚本。 但是我想让屏幕继续运行,以便随时查看其中一个脚本的进度,我总是可以执行screen -d -r <PID> ,它会重新连接屏幕让我看到进度。
我相信肯定有办法做到这一点。 但是我发现的类似问题还没有回答。
crontab启动一个屏幕 如何使用crontab启动一个屏幕会话?
你真的不得不与命令交互,或者你只是想在命令完成之前看到状态,结果会邮寄给你?
我遇到了类似的“问题”,我在cron中运行traceroute(8)和mtr来监视连通性, mtr在for -loop中运行,在给定的时间间隔内(5和16.67之间)提供更精确的测量分钟(300到1000个周期)),但整个脚本devise运行了大约一个小时(以确保我不会收到垃圾邮件),所以我希望能够看到发生的状态。
cron工作方式是在/ tmp中创build一个临时文件,并立即调用unlink(2) (但仍然保持打开文件)。 随后用于在脚本完成之前存储脚本的输出,并将其通过电子邮件发送给您。
因此,您可以使用lsof -n -c cron (和/或lsof -n | fgrep cron )来查找已删除的打开文件的数量,然后通过/proc/$PID/fd/$FD访问这些文件/proc/$PID/fd/$FD命名空间来查看从cron内运行的脚本的输出,而不需要任何screen 。
你可以尝试这样的事情:
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'
它应该工作,我相信。 当然,编辑时间,无论你需要什么。
上面的(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命令,每天创build这些文件 – 像布尔标志一样工作来启动脚本调用。
脚本完成后,文件将被删除。 这样你就可以为你的脚本保留相同的会话,并且还可以按你喜欢的时间间隔运行它。
如果循环中的60秒延迟对您来说太多(在这种方法下,在给定的时间没有办法精确运行脚本,因为睡眠将在不可预知的时间内执行),那么您可以设置inotifywait监视并执行脚本一旦文件被创build。
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