用于Cronjob的Screen Bash脚本

时间:2011-07-10 15:15:44

标签: bash gnu-screen

您好我正在尝试将屏幕用作cronjob的一部分。

目前我有以下命令:

screen -fa -d -m -S mapper /home/user/cron

无论如何,如果屏幕映射器已经存在,我可以使此命令不执行任何操作吗?映射器设置在半小时的cronjob上,但有时映射需要半个多小时才能完成,因此它们重叠,相互减慢,有时甚至导致下一个慢,所以我最终得到很多映射器屏幕正在运行。

感谢您的时间,

2 个答案:

答案 0 :(得分:6)

ls /var/run/screen/S-"$USER"/*.mapper >/dev/null 2>&1 || screen -S mapper ...

这将检查当前用户是否存在任何名为mapper的屏幕会话,并且只有在没有任何屏幕会话时才会启动新会话。

答案 1 :(得分:2)

为什么您希望cron运行的作业(根据定义)没有附加终端,可以对屏幕执行任何操作?根据{{​​3}},'GNU Screen是一个软件应用程序,可用于复用多个虚拟控制台,允许用户访问多个单独的终端会话。

但是,假设有一些理由这样做,那么您可能需要创建一个锁定文件,进程在继续之前检查该文件。此时,您需要从cron条目运行shell脚本(这通常是一种很好的技术),shell脚本可以检查上一次任务是否已完成,如果没有则退出。如果先前的化身已完成,则当前的化身会创建一个包含其PID的锁定文件并运行该作业。完成后,它会删除锁定文件。您应该查看shell trap命令,并确保如果shell脚本由于可捕获信号而退出(您无法捕获KILL和某些过程控制信号),则会删除锁定文件。

从另一个答案来看,screen程序已经创建了锁文件;您可能不需要做任何特殊的事情来创建它们 - 但需要检测它们是否存在。另请查看Wikipedia的GNU手册。