如何确定某个进程是否正在运行并利用它来制作条件 shell 脚本?

如何确定某个进程是否正在运行并利用它来制作条件 shell 脚本?

我如何确定某个进程是否正在运行,然后让 bash 脚本根据该条件执行一些操作?

例如:

  • 如果进程abc正在运行,则执行此操作

  • 如果它没有运行,就执行此操作。

答案1

执行此类操作的 Bash 脚本如下所示:

#!/bin/bash

# Check if gedit is running
# -x flag only match processes whose name (or command line if -f is
# specified) exactly match the pattern. 

if pgrep -x "gedit" > /dev/null
then
    echo "Running"
else
    echo "Stopped"
fi

该脚本只是检查程序“gedit”是否正在运行。

或者你只能像这样检查程序是否没有运行:

if ! pgrep -x "gedit" > /dev/null
then
    echo "Stopped"
fi

答案2

任何使用类似ps aux | grep abcpgrep abc有缺陷的解决方案。

为什么?

因为您不是在检查特定进程是否正在运行,而是在检查是否有任何恰好与 匹配的正在运行的进程abc。任何用户都可以轻松创建和运行名为 的可执行文件abc(或abc在其名称或参数中包含某处),从而导致您的测试出现误报。您可以对 和 运用各种选项来ps缩小grep搜索pgrep范围,但您仍然无法获得可靠的测试。

那么,如何可靠地测试某个正在运行的进程?

这取决于您需要测试什么。

我想确保服务美国广播公司正在运行,如果没有,则启动它

这就是 systemd 的作用。它可以自动启动服务并跟踪它,当服务停止时它可以做出反应。

我如何检查我的游戏服务器是否仍在运行......寻找其他解决方案。

美国广播公司是我的脚本。我需要确保只有一个脚本实例正在运行。

在这种情况下,使用 lockfile 或 lockdir。例如

#!/usr/bin/env bash

if ! mkdir /tmp/abc.lock; then
    printf "Failed to acquire lock.\n" >&2
    exit 1
fi
trap 'rm -rf /tmp/abc.lock' EXIT  # remove the lockdir on exit

# rest of script ...

Bash 常见问题 45其他锁定方式。

答案3

这是我使用的:

#!/bin/bash

#check if abc is running
if pgrep abc >/dev/null 2>&1
  then
     # abc is running
  else
     # abc is not running
fi

用简单的英语来说:如果“pgrep”返回 0,则表示进程正在运行,否则表示没有运行。


相关阅读:

Bash 脚本 ::字符串比较

Ubuntu 手册程序包

答案4

借鉴@rommel-cid的想法,pidof如果进程不存在,您可以使用||(||)来运行命令,如果进程存在,则使用&&来运行某些命令,从而创建一个快速的if/then/else条件。例如,这里有一个正在运行的进程(我的chrome浏览器,其进程名称为“chrome”)和一个测试不存在的进程的进程。我使用1> / dev / null抑制了标准输出,以便它不会打印:

$ (pidof chrome 1>/dev/null && echo "its running? ok, so am i then" ) || echo "it's not running? ok i'll run instea\
d"
its running? ok, so am i then
$ (pidof nosuchprocess 1>/dev/null && echo "its running? ok, so am i then" ) || echo "it's not running? ok i'll run\
 instead"
it's not running? ok i'll run instead
$

相关内容