尽管
pidof和
pgrep是确定正在运行的工具的绝佳工具,但不幸的是,它们在某些操作系统上均不可用。确定的故障保护将使用以下内容:
ps cax |grep command
Gentoo Linux上的输出:
14484?S 0:00 apache214667吗?S 0:00 apache219620?SL 0:00 apache221132?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/bashps cax | grep httpd > /dev/nullif [ $? -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/bashPROCESS=$1PIDS=`ps cax | grep $PROCESS | grep -o '^[ ]*[0-9]*'`if [ -z "$PIDS" ]; then echo "Process not running." 1>&2 exit 1else for PID in $PIDS; do echo $PID donefi
您可以通过将其保存到具有执行许可权(chmod + x running)的文件(名为“ running”)中并使用以下参数来对其进行测试:
./running "httpd"
#!/bin/bashps cax | grep httpdif [ $? -eq 0 ]; then echo "Process is running."else echo "Process is not running."fi
警告!!!
请记住,您只是在解析输出,
psax这意味着从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



