i当前的脚本看起来像这样。
# code
mplayer "$vid"
# more code
问题是,如果此脚本被杀死,则Mplayer过程的生命。我想知道如何做到这一点,以便杀死脚本也会杀死mplayer。
我无法使用exec
,因为我需要在mplayer之后运行命令。
exec mplayer "$vid"
我唯一能想到的解决方案是在后台产生它,然后等到它手动完成。这样,我可以得到它的pid并在剧本被杀死时杀死它,而不是完全优雅。我想知道这样做的"正确"或最佳方法是什么。
我能够测试我在评论中发布的prctl想法,而且似乎有效。您将需要编译以下内容:
#include "sys/prctl.h"
#include "stdlib.h"
#include "string.h"
#include "unistd.h"
int main(int argc, char ** argv){
prctl(PR_SET_PDEATHSIG, atoi(argv[1]),0,0,0);
char * argv0 = strdup(argv[2]);
char * slashptr = strrchr(argv0, '/');
if(slashptr){
argv0 = slashptr + 1;
}
return execvp(argv0, &(argv[2]));
}
假设您已将上述内容编译到一个名为" prun"的可执行文件中,并且在您的路上。假设您的脚本称为" foo.sh",它也在您的道路上。制作一个呼叫
的包装脚本 prun 15 foo.sh
foo.sh应出于任何原因终止包装脚本,甚至是Sigkill时都应获得SIGTEM。
注意:这是一个仅Linux解决方案,并且提供的C源代码无需详细检查参数
感谢Mux的领先优势。看来除手动捕获信号外,除了手动捕获信号外,没有办法这样做。这是最终工作(过度评论)版本。
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
(更新)我想我现在要寻找什么:
您可以通过产卵来运行您的脚本来实现这一目标:
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,而不是等到结束。
好吧,您可以简单地杀死进程组,这样整个过程树就会被杀死,首先找出组ID
ps x -o "%p %r %c" | grep <name>
然后使用杀戮:
kill -TERM -<gid>
请注意过程组ID之前的破折号。或单线:
kill -TERM -$(pgrep <name>)
也许使用命令替换在子壳中运行 mplayer "$vid"
:
$(mplayer "$vid")
我以这种方式进行了测试:
tesh.sh:
#!/bin/sh
$vid = "..."
$(mplayer "$vid")
% test.sh
在单独的终端中:
% pkill test.sh
在原始端子中,mplayer停止,打印到stderr
Terminated
MPlayer interrupted by signal 13 in module: av_sync