【问题标题】:How to use Perl to check when a Unix command has finished processing如何使用 Perl 检查 Unix 命令何时完成处理
【发布时间】:2018-09-07 10:05:31
【问题描述】:

我正在做一个顶点项目,希望能得到一些见解。

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

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

例子:

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

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

【问题讨论】:

  • 你怎么称呼那个命令?如果您向我们展示您在说什么,那么在 Stack Overflow 上提问效果最好。一般描述很难调试。请edit您的问题并添加您的代码,以及您获得的输出以及预期的输出。另见minimal reproducible exampleHow to Ask
  • system
  • @simbabque 我没有任何代码可以给你看,因为我还不知道如何创建它。我使用 system() 调用命令。
  • @Locutus:如果你“使用 system() 调用命令”,那么你就有了代码。请出示。
  • @Borodin 已添加到帖子中。

标签: perl unix


【解决方案1】:

您可以尝试使用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');

【讨论】:

    【解决方案2】:

    很抱歉,如果我不理解您的提问内容。 但是如果你想做并行进程,你不能用perl进程fork函数代替&amp;吗?

    # 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 &
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-15
      • 1970-01-01
      • 1970-01-01
      • 2011-07-12
      • 1970-01-01
      • 1970-01-01
      • 2018-08-31
      • 2012-04-01
      相关资源
      最近更新 更多