【问题标题】:Start new process after killing older one (if exists)杀死旧进程后启动新进程(如果存在)
【发布时间】:2016-04-30 19:08:49
【问题描述】:

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

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

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

【问题讨论】:

    标签: linux bash shell terminate


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的详细解释。我可以想到这种行为,但想知道是否存在可以执行此操作的某些命令或命令的单行组合。
    • 这确实是要走的路。我建议您进一步阅读ProcessManagement
    【解决方案2】:

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

    -o, --older-than

    仅匹配时间较早(开始之前)的进程 指定的。时间指定为浮点数,然后是单位。这 单位是 s,m,h,d,w,M,y 秒、分钟、小时、天、 分别为周、月和年。

    因此这应该可以工作:

    killall -o 5s runscript.sh
    

    另一个答案从根本上更好,因为它是弹性的“专业”方法,但如果它只是用于您自己的脚本并且您想采取简单的方法,这种方法应该可以工作。

    【讨论】:

    • 这个可以根据PID来做吗?最好让它与时间无关。尽管您的解决方案足以满足我的要求。
    • 这里的一个问题是您需要确切地知道如何该过程是如何启动的,因为killall 基于名称(路径)。
    猜你喜欢
    • 1970-01-01
    • 2016-04-23
    • 1970-01-01
    • 1970-01-01
    • 2018-11-29
    • 2018-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多