我有一个需要经常启动的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
另一个答案从根本上更好,因为它是弹性的"专业"方法,但如果它只是针对您自己的脚本并且您想采取简单的方法,那么这种方法应该有效。