今天本来想写个runner的程序,用于运行一个程序,并获取这个进程的pid、运行时间、运行log、错误log等信息,但发现了一个好用的东西,shell中$!的作用是显示最后运行的后台Process的PID(后台运行的最后一个进程的进程ID号)
于是我的runner程序便没有必要写了,想要获取一个进程的pid除了用top、ps等常用方法,还可以如下做法
1 2 |
# sleep 14 & echo $! 3214 |
于是基于这个$!就衍生了一个优化守护脚本的方法,以往的守护进程只是通过ps 加grep搜索自己的进程,可能带来误判,效率还很低,使用$!就可以更高效率的执行了,如下示例代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
#!/bin/sh runner() { local cmd=$1 local log="/dev/null" local errlog="/dev/null" [ -n "$2" ]&& log=$2 [ -n "$3" ]&& errlog=$3 echo $cmd > /dev/tty $cmd 1>${log} 2>${errlog} & #一定要后台运行 local pid=$(echo $!) echo "get $pid" > /dev/tty echo $pid return } check_pid_running() { local pid=$1 if [ -f /proc/$pid/stat ];then echo "check done...yes" >/dev/tty echo "yes" else echo "check done...no" >/dev/tty echo "no" fi } echo "start $(date)" mypid=$(runner "sleep 14") echo mypid=$mypid $(date) while [ 1 ];do echo "check...$mypid" if [ "$(check_pid_running ${mypid})" = "no" ];then mypid=$(runner "sleep 14") echo "sleep process exit,rerun,pid=$mypid" fi sleep 5 done |
测试通过