【问题标题】:Screen Bash Scripting for CronjobCronjob 的 Screen Bash 脚本
【发布时间】:2011-07-10 15:15:43
【问题描述】:

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

目前我有以下命令:

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

如果屏幕映射器已经存在,我可以让这个命令什么都不做吗?映射器设置为半小时 cronjob,但有时映射需要半个多小时才能完成,因此它们重叠,彼此减慢,有时甚至导致下一个变慢,所以我最终得到许多映射器屏幕正在运行。

感谢您的宝贵时间,

【问题讨论】:

  • 这是一个关于如何编写用于 cron 的 shell 脚本的直截了当的问题。因此,它是 StackOverflow 的主题。
  • @Jonathan:我同意,我不明白票数接近。

标签: bash gnu-screen


【解决方案1】:
ls /var/run/screen/S-"$USER"/*.mapper >/dev/null 2>&1 || screen -S mapper ...

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

【讨论】:

  • 完美答案,非常聪明的解决方案!我已将其添加为书签以备将来使用!
【解决方案2】:

您为什么想要由cron 运行的作业(根据定义)没有附加终端来对屏幕执行任何操作?根据Wikipedia 的说法,“GNU Screen 是一种软件应用程序,可用于多路复用多个虚拟控制台,允许用户访问多个单独的终端会话”。

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

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

【讨论】:

  • 其实有几个原因。一种是您希望稍后能够过来查看工作的进展情况,并手动干预自动启动的工作。另一个是如果您希望 cron 添加或修改已在屏幕中运行的内容。
  • 例如运行游戏服务器,原因如上。
  • @Caleb:如果您想通过其文本输出检查作业的进展情况,更典型的做法可能是将 cronjob 的输出重定向到文件并在需要时读取它。
猜你喜欢
  • 1970-01-01
  • 2022-06-15
  • 2015-02-16
  • 2021-11-17
  • 1970-01-01
  • 2012-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多