我目前有一个脚本,看起来像这样。
# code
mplayer "$vid"
# more code问题是,如果这个脚本被终止,mplayer进程就会存活。我想知道我如何才能做到这样,这样杀死脚本也会杀死mplayer。
我不能使用exec,因为我需要在mplayer之后运行命令。
exec mplayer "$vid"我能想到的唯一可能的解决方案是在后台生成它,然后等待它手动完成。这样我就可以获得PID,并在脚本终止时终止它,这并不是很优雅。我想知道做这件事的“适当”或最好的方法是什么。
发布于 2012-11-05 07:59:41
感谢Mux的领导。在bash中,除了手动捕获信号之外,似乎无法做到这一点。这是一个最终的工作(过度评论)版本。
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
发布于 2012-11-05 02:16:02
(更新了)我想我知道你现在在找什么了:
您可以通过生成一个新的终端来运行您的脚本来实现这一点:
gnome-terminal -x /path_to_dir_of_your_script/your_script_name(或者使用xterm -e或konsole -e而不是gnome-terminal -x,这取决于您所在的系统)
所以现在每当你的脚本结束/退出(我假设你在脚本的某些部分有exit 0或exit 1 ),新产生的终端也会退出,因为脚本结束了-这反过来也会杀死在这个新终端下产生的任何应用程序。
例如,我刚刚用这个脚本测试了上面的命令:
#!/bin/bash
gedit &
pid=$!
echo "$pid"
sleep 5
exit 0正如您所看到的,没有显式调用来终止新的gedit进程,但是只要脚本退出,应用程序(gedit)就会立即关闭。
(前面的回答:或者,如果您只是简单地询问如何终止进程)这里有一个简短的示例,说明如何使用kill来完成此任务。
#!/bin/bash
gedit &
pid=$!
echo "$pid"
sleep 5
kill -s SIGKILL $pid除非我误解了您的问题,否则您可以立即获得派生进程的PID,而不是等到它完成。
发布于 2012-11-05 02:34:12
你可以简单地杀死进程组,这样整个进程树就会被杀死,首先找出组id。
ps x -o "%p %r %c" | grep <name>然后像这样使用kill:
kill -TERM -<gid>注意进程组id前面的破折号。或者一行代码:
kill -TERM -$(pgrep <name>)https://stackoverflow.com/questions/13221338
复制相似问题