【发布时间】:2021-06-19 19:36:47
【问题描述】:
我有一个 Perl 脚本,它使用system() 函数按顺序启动一些程序。当脚本正在运行并且程序正在运行时,我键入 CTRL + C。我希望程序终止(发生),但我也希望脚本终止(这不会发生)。
我已经构建了一个最小的工作示例。这是 Perl 脚本:
#!/bin/env perl
sub run_the_test {
local($name, $_) = @_;
print "Starting $name\n";
return system("program.bash $name");
}
&run_the_test("test1");
&run_the_test("test2");
&run_the_test("test3");
这是外部“程序”:
#!/bin/env bash
echo "Started $1"
sleep 3
echo "Finished $1"
我启动了脚本并发出了 CTRL + Z。然后我做了一个ps -o pid,pgrp,cmd 来列出进程信息。我可以看到脚本、它调用的 bash shell 和 sleep 命令都属于同一个进程组。虽然sleep 正在执行,但我也希望它是前台进程组。我在 Linux、信号和终端上阅读了一些内容,发现 CTRL + C 应该向整个前台进程组发送中断,从而也终止脚本。
我也尝试过使用exec() 而不是system()。这样脚本在触发 CTRL + C 时确实会停止,但不会通过 test1。
谁能解释一下这里发生了什么?
【问题讨论】:
-
"这样脚本在触发 CTRL + C 时会停止" - 不,这样脚本在程序启动时就消失了。
exec仅在失败时返回。 -
你为什么要写 perl4 风格的代码?现在已经不是 1993 年了。请
use strict;和use warnings;,不要用&打电话给潜艇。 -
@melpomene 这是我剥离的一些遗留 Perl 脚本的 sn-p。