在bash里使用PID文件

实践中,我们把一些任务放到后台运行,停止/重启任务时需要找到任务的PID(process Id)。
我们可以采用下面的方式:

$ ./task.sh &
$ ps -ef|grep task.sh
hao      18635 18496  0 22:20 pts/0    00:00:00 /bin/bash ./task.sh
hao      18673 18496  0 22:20 pts/0    00:00:00 grep task.sh

这种方式的不便之处在于不适合编写脚本。
更好的的方式是使用一个PID文件,记录下任务的PID,如下:

$ ./task.sh & echo $! > pid
$ cat pid
19219

需要杀死进程时,如下:

$ PID=`cat pid` && pkill -P $PID && kill $PID

下面是一个启动任务,然后关闭的例子:

#! /bin/bash

# 后台启动任务,把PID保存在文件pid里
# "1>/dev/null 2>&1"丢弃了标准输出和错误输出
nohup ./task.sh 1>/dev/null 2>&1 & echo $!>pid

# 打印服务状态
if ps -p `cat pid` >&-; then echo UP; else echo DOWN; fi

# 杀死任务的子进程及任务进程
PID=`cat pid` && pkill -P $PID && kill $PID

参考资料:
Write a PID file in bash
Best way to kill all child processes

SyntaxHighlighter Evolved语法高亮插件效果演示

C代码显示效果:

extern MagickExport char
  *Base64Encode(const unsigned char *,const size_t,size_t *),
  **GetPathComponents(const char *,size_t *),
  **ListFiles(const char *,const char *,size_t *);

Java代码显示效果:

public interface Job {
        public Response go(Request request);
}

Ruby代码显示效果:

def to_hex(str)
  str.bytes.map { |b| '0x' + b.to_s(16) }.join(' ')
end