我有一个我需要频繁启动的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
如果进程已在运行,则终止该进程。它解决了杀死旧流程的目的,但没有让新流程开始。原因很明显,我后来才明白。
这样做的正确方法是什么?
答案 0 :(得分:7)
这种方法的典型方法是使用基于文件系统的锁定策略:
该脚本创建一个锁定文件(/var/lock/subsystem/...
),其中包含自己的进程号作为内容。启动时,首先检查此类文件是否已存在。如果没有,一切都很好。但如果是这样,那么它会从文件中读取进程号并使用它来检查进程表。如果这样的过程仍然存在,那么它可以退出(通常的行为),或者它可以通过发送SIG-TERM信号来终止该过程(你要求的)。
答案 1 :(得分:2)
您可以改用killall
。麻烦的是你想要避免杀死你当前的进程,但这很容易用-o
标志完成:
-o, - older-than
仅匹配较早(之前开始)时间的进程 指定。时间被指定为浮点数然后是单位。该 单位是秒,分,小时,天,s,m,h,d,w,M,y, 几周,几个月和几年。
因此,这应该有效:
killall -o 5s runscript.sh
另一个答案从根本上说是更好的,因为它是有弹性的“专业”方法,但如果只是为了你自己的脚本而你想要采取简单的方法,这种方法应该有效。