Bash Shell 判断进程存在的3种方法

bash版本:
GNU bash, version 3.2.48(1)-release (i486-pc-linux-gnu)
Copyright (C) 2007 Free Software Foundation, Inc.
假设当前系统中的进程有如下几个:
$ ps -ef
UID PID PPID C STIME TTY TIME CMD
root 3480 1 0 07:57 ? 00:00:00 /usr/sbin/bluetoothd
root 2425 1 0 07:56 ? 00:00:00 /bin/sh /usr/bin/mysqld_safe
syslog 2272 1 0 07:56 ? 00:00:00 /sbin/syslogd -u syslog
root 2147 1 0 07:56 tty4 00:00:00 /sbin/getty 38400 tty4
root 2148 1 0 07:56 tty5 00:00:00 /sbin/getty 38400 tty5
root 2154 1 0 07:56 tty2 00:00:00 /sbin/getty 38400 tty2
root 2156 1 0 07:56 tty3 00:00:00 /sbin/getty 38400 tty3
root 2157 1 0 07:56 tty6 00:00:00 /sbin/getty 38400 tty6
root 3255 1 0 07:57 ? 00:00:00 /usr/sbin/vsftpd
……
这里我们检测vsftpd进程的存在与否
方法一:使用ps -p命令
ps -p命令根据给定的pid参数判断是否有这个进程,如果有这个进程正常退出,退出值0。如果没有这个进程异常退出,退出值1。
例如:
$ ps -p 3255
PID TTY TIME CMD
3255 ? 00:00:00 vsftpd
$ echo $?
0
$ ps -p 3000
PID TTY TIME CMD
$ echo $?
1
方法二:使用pgrep命令
pgrep命令根据给出的进程名判断是否有这个名字的进程。如果有这个名字的进程正常退出,退出值0。如果没有这个名字的进程异常退出,退出值1。
例如:
$ pgrep vsftpd
3255
$ echo $?
0
$ pgrep qq
$ echo $?
1
此方法不够准确,比如你执行 $ pgrep vsf 一样可以查询到3255。
方法三:查看/proc目录
每个进程都会在/proc下有一个以进程PID命名的目录。
例如:
$ ls /proc/3255/
ls: 无法读取符号链接 /proc/3255/cwd: Permission denied
ls: 无法读取符号链接 /proc/3255/root: Permission denied
ls: 无法读取符号链接 /proc/3255/exe: Permission denied
attr cpuset io mountinfo pagemap smaps wchan
auxv cwd latency mounts personality stat
cgroup environ limits mountstats root statm
clear_refs exe loginuid net sched status
cmdline fd maps oom_adj schedstat syscall
coredump_filter fdinfo mem oom_score sessionid task
$ ls /proc/3000
ls: 无法访问 /proc/3000: 没有该文件或目录
可以根据上面的事例,编写shell脚本判断一个进程存在与否。下面以方法二和三编写脚本,方法一类似。
脚本一:
#!/bin/bash
if [ -z $1 ]
then
echo “需要参数”
exit 1
fi

if test $( pgrep -f $1 | wc -l ) -eq 0
then
echo “进程不存在”
else
echo “存在进程”
fi
脚本二:
#!/bin/bash
if [ -z $1 ]
then
echo “需要进程PID”
exit 1
fi

if [ -d /proc/$1 ];then
echo “存在此进程”
else
echo “进程不错在”
fi

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注


*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>