【问题标题】:Restart a process if it is running in Bash如果进程在 Bash 中运行,则重新启动它
【发布时间】:2016-03-03 14:22:53
【问题描述】:

您好,我正在尝试检查一个进程是否正在运行,如果是,请重新启动它。但如果不是,请启动它。该脚本在使用 Plink 从 Windows 机器远程执行了一批命令后运行。然后我运行另一个 plink 命令来运行这个脚本。主机上的应用程序正在持续运行。

SERVICE="./Snowflake.app/Contents/MacOS/Snowflake"

if pgrep "$SERVICE" >/dev/null 2>&1 ; 
then
echo "$SERVICE is running"
pkill "$SERVICE"
 else
  /Applications/snowflake/run.sh

fi

这里的问题是,如果应用程序打开,它不会关闭它,而是再次打开应用程序。谁能告诉我哪里出错了?

【问题讨论】:

    标签: bash grep kill restart


    【解决方案1】:

    我建议简单地,愚蠢地终止进程并检查错误消息,如No process found(在这种情况下并不是真正的错误)。

    在终止进程之前检查进程是否正在运行的每次尝试都容易出现竞争条件,这意味着进程可能会在您检查后立即启动。

    【讨论】:

    • 对不起,我不得不第二次输入 pkill,是的,你是对的,这很愚蠢。
    • 其实它不傻。它在竞争条件下是安全的.. :)
    【解决方案2】:

    问题是你已经将 pgrep 的所有输出发送到 /dev/null 把这个简单了,它会工作的。 (经过测试!)

    【讨论】:

    • 重定向命令的输出不会改变$?的值,这是if正在检查的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-25
    • 2015-02-20
    • 1970-01-01
    • 2018-04-25
    • 2012-10-30
    相关资源
    最近更新 更多