杀死旧进程(如果存在)后开始新进程



我有一个需要经常启动的shell脚本。我可以设置快捷方式开始(我用来启动),但不能终止。我需要按 Ctrl+C 来终止它。结果有时最终会打开许多流程。

所以我想做的是在脚本中添加一些命令,该命令检查脚本中的旧进程是否存在并杀死它,然后启动新进程。

只是为了让我的要求更清楚,我尝试遵循

假设正在运行的脚本是/home/user/runscript.sh .
ps aux | grep runscript.sh给我

user+  6135  0.0  0.0  16620  1492 ?        S    18:28   0:00 /home/user/runscript.sh
user+  6208  0.0  0.0  15936   952 pts/6    R+   18:28   0:00 grep --color=auto runscript.sh

我在脚本中预置了以下内容

pkill -f runscript.sh

如果进程已在运行,则终止该进程。它解决了杀死旧进程的目的,但没有让新进程开始。原因很明显,我后来明白了。

正确的方法是什么?

典型的方法是使用基于文件系统的锁定策略:

该脚本创建一个锁定文件 ( /var/lock/subsystem/... ),其自己的进程号作为内容。启动时,它首先检查此类文件是否已存在。如果没有,一切都很好。但如果是这样,那么它会从文件中读取进程号并使用它来检查进程表。如果这样的进程仍然存在,那么它可以退出(通常的行为),也可以通过发送SIG-TERM信号来终止该进程(你所要求的)。

你可以改用killall。问题是你想避免杀死你当前的进程,但这很容易用-o标志完成:

-o, --old-than

仅匹配较早(之前启动)的进程 指定。 时间被指定为浮点数,然后指定为单位。 这 单位是秒、分钟、小时、天、秒、米、小时、天、 分别是周、月和年。

因此,这应该有效:

killall -o 5s runscript.sh

另一个答案从根本上更好,因为它是弹性的"专业"方法,但如果它只是针对您自己的脚本并且您想采取简单的方法,那么这种方法应该有效。

最新更新