当Bash脚本被杀死时,如何杀死当前命令



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 -ekonsole -e代替gnome-terminal -x,具体取决于您的系统)

因此,现在每当您的脚本结束/退出时(我认为您在脚本的某些部分中都有exit 0exit 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

相关内容

  • 没有找到相关文章

最新更新