如何用Shell脚本判断一个进程是否在运行?

我现在想写个脚本来重启进程,但首先需要得知这个线程是不是在运行,是的话就杀掉。
我知道ps -ef|grep <参数> 可以获取含有<参数>的运行中的程序,但是每次获取都是有结果的,因为这个:(例如<参数>为java)

zsdx      7552  6702  0 11:36 pts/0    00:00:00 grep --color=auto java

我要怎么排除掉这个输出,才能实现判断进程的运行状态?
或者有什么其他的办法适用于这种情况的?谢谢。

阅读 9.9k
4 个回答

可以串一个| grep -v grep把grep去掉

警告: 用ps+grep找进程其实是不可扩展的,如果将来有多个匹配的进程.. 安全的方法是启动时把pid写到文件,要杀掉时从pidfile读。或者交给supervisor管理。

linux下面,对进程进行管理的通用的做法是在进程启动时,将进程号写到文件里面,可以去/var/run/目录里面看看,里面有各种.pid文件。管理的时候,读取这个文件获得进程号。

举个例子:ps -ef|grep [j]ava

[root@nginx conf.d]# ps -aux | grep  "nginx" | grep -v "grep" 
root       1950  0.0  0.4  47904  2232 ?        Ss   03:43   0:00 nginx: master process nginx
nginx     13545  0.0  0.5  48336  2504 ?        S    22:27   0:00 nginx: worker process
[root@nginx conf.d]# ps -aux | grep  "nginx" | grep -v "grep" > /dev/null
[root@nginx conf.d]# echo $?
0

需要根据实际情况做修改

补充一个

[root@nginx ~]# ps -C nginx
   PID TTY          TIME CMD
  1950 ?        00:00:00 nginx
 13545 ?        00:00:00 nginx
[root@nginx ~]# 
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题