屏幕Bash脚本编写用于Cronjob

3

你好,我正在尝试将屏幕作为cronjob的一部分使用。

目前我有以下命令:

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

有没有办法使这个命令如果屏幕映射已经存在,则不执行任何操作?该映射设置为每半小时运行一次,但有时映射需要超过半小时才能完成,因此它们会重叠,互相拖慢速度,甚至有时会导致下一个映射变慢,最终导致大量映射屏幕同时运行。
感谢您的时间。

2
这是一个关于如何编写适用于cron的shell脚本的直截了当的问题。因此,它是StackOverflow上合适的话题。 - Jonathan Leffler
1
@Jonathan:我同意,我不理解为什么会有关闭投票。 - John Zwinck
2个回答

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

这将检查当前用户是否存在名为mapper的屏幕会话,仅当不存在时才会启动一个新的会话。


完美的答案,非常聪明的解决方案!我已经收藏了这个以备将来使用! - Pez Cuckow

2
为什么您想要一个由运行的工作,它(根据定义)没有连接到终端,与屏幕有任何关系?根据Wikipedia,“GNU Screen是可以用于多路复用几个虚拟控制台的软件应用程序,允许用户访问多个单独的终端会话”。
然而,假设有某些原因需要这样做,那么您可能需要创建一个锁文件,进程在继续之前检查该文件。此时,您需要从条目中运行一个shell脚本(通常是一个很好的技术),shell脚本可以检查任务的上一次运行是否已完成,如果没有则退出。如果上一个实例已经完成,则当前实例创建一个包含其PID的锁文件并运行该作业。当它完成时,它将删除锁定文件。您应该检查shell trap命令,并确保如果shell脚本因可捕获的信号而退出,则删除锁定文件(您无法捕获KILL和一些进程控制信号)。
根据另一个答案的说法,screen程序已经创建了锁定文件;您可能不需要特别做什么来创建它们 - 但需要检测它们是否存在。还要检查GNU手册中的screen

实际上有几个原因。一个原因是您想能够稍后查看作业的进度并手动干预自动启动的作业。另一个原因是如果您想让 cron 添加或修改已在 screen 中运行的内容。 - Caleb
例如运行游戏服务器,出于上述原因。 - Pez Cuckow
@Caleb:如果你想通过文本输出来检查作业的进度,更典型的做法可能是将cronjob的输出重定向到文件中,需要时再读取它。 - John Zwinck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接