pidof命令获取不到程序的pid问题解决
作者:viyon
pidof命令获取不到程序的pid
问题描述
有一个功能,需要监控某个进程是否运行,如果由于某些原因没在运行(如异常挂死),则执行某个脚本,重新启动系统。很简单那的一个功能,三下五除二写了一个脚本:
#!/bin/bash all_process_pid=(`pidof xxxx`) process_num=${all_process_pid[*]} if [ ${process_num} -eq 1 ];then echo "normal" else echo "unnormal" fi exit
运行后,很完美,可以正常工作。然而在运行了一段时间后,总是发现系统莫名奇妙地重启,查看日志发现被监控的xxxx进程总是异常退出,因而会重启系统。然而这个进程一般情况下比较稳定,不会那么频繁的挂死。但为了确定问题,就在监控脚本中加了一些调试信息,打印出现异常时候所有的进程。当出现问题的时候,发现这个进程其实是存在的,通过ps可以看到这个进程正则运行,但通过pidof获得的进程却为空,基本上判断是pidof未找到进程ID导致的,可为什么pidof未找到呢?查询资料后发现,pidof默认情况下,不能列出zombie和I/O waiting状态的进程。
查看 zombie和I/O waiting状态的进程
通过pidof -h可以看到有个-z选项可以列出zombie和I/O waiting状态的进程。
[root@probe: ~]$ pidof -h pidof usage: [options] <program-name> -c Return PIDs with the same root directory -d <sep> Use the provided character as output separator -h Display this help text -n Avoid using stat system function on network shares -o <pid> Omit results with a given PID -q Quiet mode. Do not display output -s Only return one PID -x Return PIDs of shells running scripts with a matching name -z List zombie and I/O waiting processes. May cause pidof to hang.
但这个-z选项可能会导致pidof异常。
需要注意的是,不是每个发行的操作系统中的pidof命令都有-z选项,比如我目前使用的fedora workstation 38版本中,pidof就没有-z选项。
[zy@fedora ~]$ pidof -V pidof from procps-ng 3.3.17 [zy@fedora ~]$ pidof -h Usage: pidof [options] [program [...]] Options: -s, --single-shot return one PID only -c, --check-root omit processes with different root -q, quiet mode, only set the exit code -w, --with-workers show kernel workers too -x also find shells running the named scripts -o, --omit-pid <PID,...> omit processes with PID -S, --separator SEP use SEP as separator put between PIDs -h, --help display this help and exit -V, --version output version information and exit
解决方案
问题既然已经明确,就比较好修改了。由于pidof使用-z选项存在风险,且pidof命令在不同的操作系统中参数不相同,当软件运行在不支持-z选项的操作系统上会有问题,因此决定使用其它命令判断。使用ps和grep组合进行判断。
参考资料https://forums.linuxmint.com/viewtopic.php?t=335764
以上就是pidof命令获取不到程序的pid问题解决的详细内容,更多关于pidof命令获取不到程序pid的资料请关注脚本之家其它相关文章!