一尘不染

Linux / Unix命令以确定进程是否正在运行?

linux

我需要一个独立于平台的(Linux / Unix | OSX)shell /
bash命令,该命令将确定特定进程是否正在运行。例如mysqldhttpd…最简单的方法/命令是什么?


阅读 303

收藏
2020-06-02

共1个答案

一尘不染

尽管pidofpgrep是确定正在运行的工具的绝佳工具,但不幸的是,它们在某些操作系统上均不可用。确定的故障保护将使用以下内容:ps cax | grep command

Gentoo Linux上的输出:

14484?S 0:00 apache2
14667吗?S 0:00 apache2
19620?SL 0:00 apache2
21132?SS 0:04 apache2

OS X上的输出:

42582 ?? Z 0:00.00(smbclient)
46529 ?? Z 0:00.00(smbclient)
46539 ?? Z 0:00.00(smbclient)
46547 ?? Z 0:00.00(smbclient)
46586 ?? Z 0:00.00(smbclient)
46594 ?? Z 0:00.00(smbclient)

在Linux和OS X上,grep都会返回退出代码,因此很容易检查是否找到了该进程:

#!/bin/bash
ps cax | grep httpd > /dev/null
if [ $? -eq 0 ]; then
  echo "Process is running."
else
  echo "Process is not running."
fi

此外,如果您想要PID的列表,也可以轻松地对这些ID进行grep:

ps cax | grep httpd | grep -o'^ [] * [0-9] *'

在Linux和OS X上,其输出相同:

3519 3521 3523 3524

以下内容的输出为空字符串,使该方法对于未运行的进程而言是安全的:

回声 ps cax | grep aasdfasdf | grep -o '^[ ]*[0-9]*'

这种方法适用于编写简单的空字符串测试,然后甚至遍历发现的PID。

#!/bin/bash
PROCESS=$1
PIDS=`ps cax | grep $PROCESS | grep -o '^[ ]*[0-9]*'`
if [ -z "$PIDS" ]; then
  echo "Process not running." 1>&2
  exit 1
else
  for PID in $PIDS; do
    echo $PID
  done
fi

您可以通过将其保存到具有执行许可权(chmod + x running)的文件(名为“ running”)中并使用以下参数来对其进行测试:
./running "httpd"

#!/bin/bash
ps cax | grep httpd
if [ $? -eq 0 ]; then
  echo "Process is running."
else
  echo "Process is not running."
fi

警告!!!

请记住,您只是在解析输出,ps ax这意味着从Linux输出中可以看出,它不仅与进程匹配,而且还传递给该程序的参数。我强烈建议在使用此方法时尽可能具体(例如./running "mysql"也将匹配“ mysqld”进程)。我强烈建议which在可能的情况下使用来检查完整路径。


参考文献:

http://linux.about.com/od/commands/l/blcmdl1_ps.htm

http://linux.about.com/od/commands/l/blcmdl1_grep.htm

2020-06-02