One obvious way to do this is to parse the output of the ps
command. For example:
sharfah@starship:~> ps -ef | grep " 1234 " | grep -v grep sharfah 1234 1 0 10:36:06 pts/65 1:20 java -serverHowever, a much neater way to do this is to use the
kill
command to send signal 0 to the process. So kill -0
will not terminate the process and the return status can be used to determine if the process is running. 0 if it is, non-zero otherwise.
sharfah@starship:~> kill -0 1234 sharfah@starship:~> echo $? 0 sharfah@starship:~> kill -0 1234x bash: kill: 1234x: no such pid sharfah@starship:~> echo $? 1For those interested, the
kill -l
command lists signal numbers and names, but 0 is not listed.
sharfah@starship:~> kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGEMT 8) SIGFPE 9) SIGKILL 10) SIGBUS 11) SIGSEGV 12) SIGSYS 13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGUSR1 17) SIGUSR2 18) SIGCHLD 19) SIGPWR 20) SIGWINCH 21) SIGURG 22) SIGIO 23) SIGSTOP 24) SIGTSTP 25) SIGCONT 26) SIGTTIN 27) SIGTTOU 28) SIGVTALRM 29) SIGPROF 30) SIGXCPU 31) SIGXFSZ 32) SIGWAITING 33) SIGLWP 34) SIGFREEZE 35) SIGTHAW 36) SIGCANCEL 37) SIGLOST
nick@sync:~$ ps --no-headers -p 6612
ReplyDelete6612 ? 00:00:01 gnome-terminal
nick@sync:~$ ps --no-headers -p 66125
nick@sync:~$
This stuff outputs a line of process' info if this PID is running and silently quits with no output if there's no such process. Very handy to use in scripts.
And you can also perform query by process' name using -C parameter.
Difficulty is if you are not the process owner, kill -0 will also return a non-zero. Notice init is running, however my user is not the owner.
ReplyDelete$ ps -p 1
PID TTY TIME CMD
1 ? 00:00:01 init
$ kill -0 1; echo $?
bash: kill: (1) - Operation not permitted
1