首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在终止Bash脚本时终止当前命令

如何在终止Bash脚本时终止当前命令
EN

Stack Overflow用户
提问于 2012-11-05 02:05:08
回答 4查看 2.1K关注 0票数 4

我目前有一个脚本,看起来像这样。

代码语言:javascript
运行
复制
# code

mplayer "$vid"

# more code

问题是,如果这个脚本被终止,mplayer进程就会存活。我想知道我如何才能做到这样,这样杀死脚本也会杀死mplayer。

我不能使用exec,因为我需要在mplayer之后运行命令。

代码语言:javascript
运行
复制
exec mplayer "$vid"

我能想到的唯一可能的解决方案是在后台生成它,然后等待它手动完成。这样我就可以获得PID,并在脚本终止时终止它,这并不是很优雅。我想知道做这件事的“适当”或最好的方法是什么。

EN

回答 4

Stack Overflow用户

发布于 2012-11-05 07:59:41

感谢Mux的领导。在bash中,除了手动捕获信号之外,似乎无法做到这一点。这是一个最终的工作(过度评论)版本。

代码语言:javascript
运行
复制
trap : SIGTERM SIGINT # Trap these two (killing) signals.  These will cause wait
                      # to return a value greater than 128 immediately after received.

mplayer "$vid" & # Start in background (PID gets put in `$!`)
pid=$!

wait $pid # Wait for mplayer to finish.
[ $? -gt 128 ] && { kill $pid ; exit 128; } ; # If a signal was recieved
                                              # kill mplayer and exit.

折射:-陷阱:http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_12_02.html

票数 3
EN

Stack Overflow用户

发布于 2012-11-05 02:16:02

(更新了)我想我知道你现在在找什么了:

您可以通过生成一个新的终端来运行您的脚本来实现这一点:

代码语言:javascript
运行
复制
gnome-terminal -x /path_to_dir_of_your_script/your_script_name

(或者使用xterm -ekonsole -e而不是gnome-terminal -x,这取决于您所在的系统)

所以现在每当你的脚本结束/退出(我假设你在脚本的某些部分有exit 0exit 1 ),新产生的终端也会退出,因为脚本结束了-这反过来也会杀死在这个新终端下产生的任何应用程序。

例如,我刚刚用这个脚本测试了上面的命令:

代码语言:javascript
运行
复制
#!/bin/bash

gedit &
pid=$!
echo "$pid"

sleep 5
exit 0

正如您所看到的,没有显式调用来终止新的gedit进程,但是只要脚本退出,应用程序(gedit)就会立即关闭。

(前面的回答:或者,如果您只是简单地询问如何终止进程)这里有一个简短的示例,说明如何使用kill来完成此任务。

代码语言:javascript
运行
复制
#!/bin/bash

gedit &
pid=$!
echo "$pid"

sleep 5
kill -s SIGKILL $pid

除非我误解了您的问题,否则您可以立即获得派生进程的PID,而不是等到它完成。

票数 2
EN

Stack Overflow用户

发布于 2012-11-05 02:34:12

你可以简单地杀死进程组,这样整个进程树就会被杀死,首先找出组id。

代码语言:javascript
运行
复制
ps x -o  "%p %r  %c" | grep <name>

然后像这样使用kill:

代码语言:javascript
运行
复制
kill -TERM -<gid>

注意进程组id前面的破折号。或者一行代码:

代码语言:javascript
运行
复制
kill -TERM -$(pgrep <name>)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13221338

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档