如何使用Perl检查Unix命令何时完成处理

时间:2018-03-28 16:04:25

标签: perl unix

我正在开展一个顶点项目,希望能有所了解。

这是我第一次使用Perl,它几乎是一个基本的Perl脚本,可以自动执行需要按特定顺序执行的几个不同的Unix命令。整个脚本中有两行执行Unix命令,需要在脚本运行其余部分之前完成处理(否则数据将不正确)。

一旦Unix命令完成处理,我怎么能使用Perl(或者这可能是一个Unix问题?)来打印一个简单的字符串?我正在研究如何读取Unix命令名称,但不知道如何实现一种方法来检查进程是否不再运行并打印一个字符串,如" X命令已完成处理"在它完成之后。

示例:

system("nohup scripts_pl/RunAll.pl &");

这会在后台运行一个需要时间来处理的命令。我问我如何在进程完成后使用Perl(或Unix?)来打印字符串。

2 个答案:

答案 0 :(得分:1)

对不起,如果我不理解您的询问背景。 但是如果你想进行并行处理,你不能使用perl进程fork函数而不是&吗?

# parent process
if (my $pid = fork) {
    # this block behaves as a normal process

    system("nohup scripts_pl/RunAll2.pl"); # you can call other system (like RunAll2.pl)
    wait; # wait for the background processing
    say 'finished both';
}
# child process
else {
    # this block behaves as a background process
    system("nohup scripts_pl/RunAll.pl"); # trim &
}

答案 1 :(得分:0)

您可以尝试使用IPC::Open3代替system

use IPC::Open3;
my $pid = open3("<&STDIN", ">&STDOUT", ">&STDERR", 'nohup scripts_pl/RunAll.pl');
waitpid( $pid, 0 );

或者,如果您需要通过shell运行nohup

my $pid = open3("<&STDIN", ">&STDOUT", ">&STDERR", 'bash','-c', 'nohup scripts_pl/RunAll.pl & wait');

更新:感谢@ikegami。如果您希望STDIN在运行命令后保持打开状态,这是一种更好的方法:

open(local *CHILD_STDIN, "<&", '/dev/null') or die $!;
my $pid = open3("<&CHILD_STDIN", ">&STDOUT", ">&STDERR", 'nohup scripts_pl/RunAll.pl');