通过终端启动多个同时连续运行的脚本,这些脚本在终端会话结束后继续运行

Posted

技术标签:

【中文标题】通过终端启动多个同时连续运行的脚本,这些脚本在终端会话结束后继续运行【英文标题】:Initiate multiple, simultaneous continuously running scripts via terminal, that continue after terminal session ends 【发布时间】:2021-12-18 21:39:20 【问题描述】:

我有许多任务需要在服务器上不断运行。当它们循环时(因此并不意味着结束),我想并行运行它们而不是顺序运行。

要运行这些脚本之一,我可以例如

 php myscript1.php;

为了并行运行它们,我一直在使用屏幕。因此,我专门为脚本创建了一个屏幕,在该屏幕中运行它,然后分离创建一个新的并在该屏幕中运行下一个。

screen -S script1
php myscript1.php;
ctrl-a d

重复

这很好,例如5. 但是如果我重新启动服务器,或者想要更改脚本的运行方式,它会变得非常烦人 - 并且正在运行的这些小型循环任务的数量越来越多。

我知道在终端的任何时候我都在努力工作,因为我什么都不知道,所以我该如何运行

php myscript1.php;  php myscript2.php;  php myscript3.php;

所以它们同时运行,并且无声(无输出)?

编辑: 值得注意的是(感谢@bossman 下面的评论澄清)这些任务的长度是可变的和弹性的,我不希望同一任务的重叠实例运行,但我希望它们连续运行。

这意味着每 10 分钟执行一次固定的 cron 作业并不理想,因为有些可能需要例如15 分钟完成,或 2 分钟。因此,我希望在循环之间使用具有固定睡眠的循环。

【问题讨论】:

不要在脚本中使用循环,而是为每个脚本创建一个 cron 作业(使用 crontab),并让该 cron 每 x 秒或分钟触发一次。 我确实想知道这一点 - 但假设它比我希望它每 10 分钟运行一次,那么仅构建一个循环并在其中睡眠 10 分钟有缺点吗? 好吧,如果你有一个通过 crontab 运行的脚本,那么重启服务器也没关系。系统将再次启动您的 crons,您也不必依赖始终打开的终端窗口,因为它作为系统进程在后台运行。 cron 应该只运行一个脚本/进程,做它需要做的事情并关闭,然后重复(在你的情况下每 10 分钟)。 每个脚本都可以有自己的cron,想加多少就加多少.. 【参考方案1】:

所以我在发布问题后不久就想到了这一点,但我想我会留下它以防其他人发现它有用。

这是我的方法(不过如果有更好的方法,请随时告诉我。

首先启动一个屏幕:这是会话中的一个会话,即使您关闭终端也会运行,因此这会处理您离开时结束的任何脚本问题。

screen -S IMMORTALSCRIPTS

命名并附加到该屏幕后,使用 & 同时运行命令以加入它们的输入(在我的情况下)

php script1.php & php script2.php & php script3.php

它们将同时运行,甚至在此屏幕上显示混合输出,但您可以通过

离开屏幕
ctrl-a d

然后返回到您的常规命令行会话并继续执行其他任何操作,或者退出。这适合我,因为我希望以后能够通过

检查脚本输出(确保它们按预期运行,而不是抛出错误)
screen -r IMMORTALSCRIPTS

如果我已经停止它们或重新启动服务器需要重新启动它们,我可以跳转到该屏幕,点击上一个命令的向上箭头并同时运行对所有脚本的调用。

【讨论】:

是的 - 有“屏幕”。您可能还想检查“tmux”。

以上是关于通过终端启动多个同时连续运行的脚本,这些脚本在终端会话结束后继续运行的主要内容,如果未能解决你的问题,请参考以下文章

请问我在Linux下想实现一个终端同时通过SSH执行其它多个终端内的shell脚本怎么实现?

与服务器同时运行循环 bash 脚本?

在 Mac 上的“终端”中使用 launchd 管理脚本

在 Linux 上的终端启动时运行 python 脚本[关闭]

Linux下开机启动脚本程序

如何打开终端并运行脚本,然后通过 discord bot 关闭它