linux kill 子进程6,linux – Bash:杀死子进程中的所有进程

在bash中,我可以通过$获取最后一个子进程的进程ID(pid)!变量.然后我可以在它完成之前终止这个子进程:

(sleep 5) & pid=$!

kill -9 $pid

这与广告一样有效.如果我现在在睡眠后使用更多命令扩展子进程,则在子进程被终止后,sleep命令会继续,即使其他命令永远不会被执行.

作为一个例子,考虑以下内容,它使用ps来旋转子进程并监视其暗杀:

# Start subprocess and get its pid

(sleep 5; echo done) & pid=$!

# grep for subprocess

echo "grep before kill:"

ps aux | grep "$pid\|sleep 5"

# Kill the subprocess

echo

echo "Killing process $pid"

kill -9 $pid

# grep for subprocess

echo

echo "grep after kill:"

ps aux | grep "$pid\|sleep 5"

# Wait for sleep to finish

sleep 6

# grep for subprocess

echo

echo "grep after sleep is finished:"

ps aux | grep "$pid\|sleep 5"

如果我将其保存到名为filename的文件并运行它,我得到这个打印输出:

grep before kill:

username 7464 <...> bash filename

username 7466 <...> sleep 5

username 7467 <...> grep 7464\|sleep 5

Killing process 7464

grep after kill:

username 7466 <...> sleep 5

username 7469 <...> grep 7464\|sleep 5

grep after sleep is finished:

username 7472 <...> grep 7464\|sleep 5

其中来自ps命令的不重要信息被替换为< ...&gt ;.看起来kill已经杀死了文件名的整体bash执行,同时让睡眠运行.

我怎样才能正确杀死整个子进程?

解决方法:

您可以在子shell中设置陷阱以在退出之前终止所有活动作业:

(trap 'kill $(jobs -p)' EXIT; sleep 5; echo done ) & pid=$!

标签:bash,shell,unix,linux,kill

来源: https://codeday.me/bug/20190627/1308654.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值