如何在某些屏幕会话内启动crontab命令?

我有一个这样运行的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来监视连通性, mtrfor -loop中运行,在给定的时间间隔内(5和16.67之间)提供更精确的测量分钟(300到1000个周期)),但整个脚本devise运行了大约一个小时(以确保我不会收到垃圾邮件),所以我希望能够看到发生的状态。

https://unix.stackexchange.com/questions/61820/how-can-i-access-a-deleted-open-file-on-linux-output-of-a-running-crontab-task

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