我需要一个独立于平台的(Linux / Unix | OSX)shell / bash命令,该命令将确定特定进程是否正在运行。例如mysqld,httpd…最简单的方法/命令是什么?
mysqld
httpd
尽管pidof和pgrep是确定正在运行的工具的绝佳工具,但不幸的是,它们在某些操作系统上均不可用。确定的故障保护将使用以下内容:ps cax | grep command
pidof
pgrep
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"
./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在可能的情况下使用来检查完整路径。
ps ax
./running "mysql"
which
参考文献:
http://linux.about.com/od/commands/l/blcmdl1_ps.htm
http://linux.about.com/od/commands/l/blcmdl1_grep.htm