杀死较旧的进程(如果存在)后启动新进程

时间:2016-01-24 13:18:10

标签: linux bash shell terminate

我有一个我需要频繁启动的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

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

这样做的正确方法是什么?

2 个答案:

答案 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

另一个答案从根本上说是更好的,因为它是有弹性的“专业”方法,但如果只是为了你自己的脚本而你想要采取简单的方法,这种方法应该有效。