我有以下脚本,无限期地监视/tmp
目录,如果这个目录中有任何文件操作,那么文件名将被while循环读取,并用b
字符替换文件名中的第一个a
字符,然后将修改后的文件名记录在test.log
文件中:
#!/bin/bash
trap ':' HUP
trap 'kill $(jobs -p)' EXIT
/usr/local/bin/inotifywait -q -m /tmp --format %f |
while IFS= read -r filename; do
echo "$filename" | sed 's/a/b/' > test.log
done
这是实际脚本的简化版本。我还有一个Sys-V类型的初始化脚本,因为我想保持LSB兼容性,所以我的初始化脚本有"force-reload"(如果服务支持,则重新加载配置。否则,服务将被重启。)选项,它会向脚本发送HUP信号。在执行"force-reload"之前,会执行"killproc -HUP test.sh",此时"pstree"的输出如下:
# pstree -Ap 4424
test.sh(4424)-+-inotifywait(4425)
`-test.sh(4426)
#
执行
strace killproc -HUP test.sh
后,子 shell 被终止:# pstree -Ap 4424
test.sh(4424)---inotifywait(4425)
#
根据strace
,killproc
发送 SIGHUP
信号给进程 4424
和 4426
,但只有后者被终止。
在我的例子中,PID为4426
的子shell 的目的是什么,即为什么首先创建它?此外,是否有一种方式来忽略 HUP
信号?