【发布时间】:2023-03-18 14:13:01
【问题描述】:
两种情况:
-
在 CLI 中运行命令
zfs 发送 rpool/fs@snap | zfs recv rpool/fs1@snap &
[1] 139781
ps -ef|grep zfs
root 139783 119679 0 23:28:34 kz/term/2 0:00 grep zfs root 139781 119679 3 23:28:30 kz/term/2 0:02 zfs recv rpool/fs1@snap root 139780 119679 3 23:28:30 kz/term/2 0:03 zfs send rpool/fs@snap杀死 -INT 139780
ps -ef|grep zfs
root 139781 119679 7 23:28:30 kz/term/2 0:08 zfs recv rpool/fs1@snap root 139785 119679 0 23:28:42 kz/term/2 0:00 grep zfs
我们可以看到当前的shell(119679)创建了两个 children(139780&139781),并且 kill -INT 可以中断 139780成功。
-
现在我们编写了一个 ksh 脚本来完成几乎相同的工作
猫 a.sh
#!/usr/bin/ksh -p echo $$ zfs send rpool/fs@snap | zfs recv rpool/fs1@snap & pid=$(ps -ef|grep 'zfs send rpool/fs@snap'|grep -v grep | awk '{print $2}') /usr/bin/kill -s INT $pid sleep 1 ps -ef|grep zfs./a.sh
139788 root 139791 139789 1 23:30:57 kz/term/2 0:01 zfs send rpool/fs@snap root 139789 139788 1 23:30:57 kz/term/2 0:01 zfs recv rpool/fs1@snap root 139798 139788 0 23:30:58 kz/term/2 0:00 grep zfs
现在 a.sh fork 139789,而 139789 fork 139791,在这种情况下, a.sh 调用 kill 命令将 SIGINT 发送到 139791,但是失败了。
为什么不 a.sh 分叉“zfs 发送”进程? (在 bash 脚本中,a.sh 分叉了发送和接收进程)? 为什么 kill -s INT 未能中断“zfs 发送”进程? 如何中断 ksh 脚本中的发送过程?
非常感谢。
【问题讨论】: