如何检测一个进程是否已运行?

wlk2002 2006-01-24 08:28:12
在Linux下.谢谢~
...全文
861 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
fierygnu 2006-02-08
  • 打赏
  • 举报
回复
一般安全吧。就linux是可以的,如果要到其它系统,有些ps不支持-ef这样的选项,而且$8的内容也不一定固定。
感恩杰 2006-02-08
  • 打赏
  • 举报
回复
ps -ef | awk -F' ' '{printf("%s\n", $8);}' | grep <APP_NAME>
这样解决应该是比较安全的吧,没有上述的顾虑。
fierygnu 2006-02-08
  • 打赏
  • 举报
回复
对付kill -9,可以劫获信号,自己处理
=====
SIGKILL和SIGSTOP不能被捕获。此外,象断电这样的事故,也需要考虑。
alaiyeshi 2006-02-08
  • 打赏
  • 举报
回复
对付kill -9,可以劫获信号,自己处理
对ps PID | grep APP_NAME的看法,同意fierygnu(va_list)的,我以前就见到了,还以为自己出了问题
fierygnu 2006-02-08
  • 打赏
  • 举报
回复
ps PID | grep APP_NAME
====
如果第二次运行的进程自己正好就是这个PID,于是就自杀了。。。
这在重启机器后的server里是常有的现象。
lishuangtao 2006-02-08
  • 打赏
  • 举报
回复
前一个程序运行创建一个pid文件,后一个程序读取有没有这个文件.
如果有,在用这个文件里面记录的PID kill -0 一下,有反应就说明在运行,不然就是异常退出。
====================
异常退出后,其它程序也可能启动占用了该pid,尤其在重启后。
====================
对,如果要避免这个问题就还要再加一个检测,也就是 ps PID | grep APP_NAME,不过一般这种可能性比较小(对于不频繁启动的server端程序,如果程序是频繁启动的,那么还是用OS提供的互斥锁最安全)
这种用shell实现的互斥运行实际上并不是完全的原子操作,在多并发的情况下可能会失效,但是如果写server程序的话,用这个最简单方便:) .
fierygnu 2006-02-06
  • 打赏
  • 举报
回复
前一个程序运行创建一个pid文件,后一个程序读取有没有这个文件.
如果有,在用这个文件里面记录的PID kill -0 一下,有反应就说明在运行,不然就是异常退出。
====================
异常退出后,其它程序也可能启动占用了该pid,尤其在重启后。
longenic 2006-02-06
  • 打赏
  • 举报
回复
qqq
lishuangtao 2006-02-06
  • 打赏
  • 举报
回复
前一个程序运行创建一个pid文件,后一个程序读取有没有这个文件.
如果有,在用这个文件里面记录的PID kill -0 一下,有反应就说明在运行,不然就是异常退出。
这个方法被广泛的使用在apache1.x和mysql里面。

shell如下:
。。。
GSB_RESTORE_PID="$GSB_VARDIR"/info/restore.pid
#check for pidfile
if [ -f $GSB_RESTORE_PID ]
then
PID=`cat $GSB_RESTORE_PID`
if [ "x$PID" != "x" ] && kill -0 $PID 2>/dev/null ; then
STATUS="gsarestore(pid $PID) running"
RUNNING=1
else
STATUS="gsarestore(pid $PID?) not running"
RUNNING=0
fi
else
STATUS="gsbbackup(no pid file) not running"
RUNNING=0
fi
。。。。
fierygnu 2006-02-06
  • 打赏
  • 举报
回复
前一个程序运行创建一个pid文件,后一个程序读取有没有这个文件。
============
这个方法不好。如果进程异常退出,则必须手工删除该文件。
bekars 2006-02-06
  • 打赏
  • 举报
回复
前一个程序运行创建一个pid文件,后一个程序读取有没有这个文件。
fierygnu 2006-02-02
  • 打赏
  • 举报
回复
文件锁的方法很可靠。当描述符关闭时锁会自动释放。
hbcb 2006-02-01
  • 打赏
  • 举报
回复
我比较喜欢用ps -ef, 然后检测这个程序名是否在里面,虽然老土和效率低下点,但是可靠

改变文件属性的方法不可以及文件锁共享内存方法好象不可靠,当程序启动后,要做锁的记录,当程序结束时把锁解除,如果在中途出现异常比如被kill -9 杀死,锁就无法解除
VisionCat 2006-01-28
  • 打赏
  • 举报
回复
用文件锁锁住自己,不允许读写访问,不就可以了么?
呵呵,顶多在启动的时候监测自己是否被所主了。不过,基本读访问被锁了,也不能被运行了吧。
alaiyeshi 2006-01-25
  • 打赏
  • 举报
回复
自己设置一个锁,就是一个临界区
实现的方法很多
锁是一个
消息队列也可以
fierygnu 2006-01-25
  • 打赏
  • 举报
回复
一般用一个文件,设置咨询锁。进程启动时试图打开文件并锁定,如果成功,则说明没有已启动进程。
wlk2002 2006-01-25
  • 打赏
  • 举报
回复
详细的说就是有一个程序,不想让他重复运行,想运行前调用一个函数来检测这个程序是否运行。
leihome 2006-01-25
  • 打赏
  • 举报
回复
lsof -i:80
根据80端口检测
yyy790601 2006-01-25
  • 打赏
  • 举报
回复
共享内存也可以啊。
sunsuny 2006-01-25
  • 打赏
  • 举报
回复
同意 wlk2002(Searky) ,
方法很多,简单点用一个文件的排他锁控制
加载更多回复(2)

23,116

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧