从Perl脚本异步执行Bash命令

时间:2013-05-27 08:41:27

标签: perl bash asynchronous

我必须运行Bash命令。但是这个命令需要几分钟才能运行。

如果我正常(同步)执行此命令,我的应用程序将挂起,直到命令完成运行。

如何从Perl脚本异步运行Bash命令?

3 个答案:

答案 0 :(得分:2)

如果您不关心结果,可以使用system("my_bash_script &");。它会立即返回,脚本会执行需要完成的操作。

我有两个文件:

$ cat wait.sh
#!/usr/bin/bash
for i in {1..5}; { echo "wait#$i"; sleep 1;}

$cat wait.pl
#!/usr/bin/perl
use strict; use warnings;
my $t = time;
system("./wait.sh");
my $t1 = time;
print $t1 - $t, "\n";
system("./wait.sh &");
print time - $t1, "\n";

输出:

wait#1
wait#2
wait#3
wait#4
wait#5
5
0
wait#1
wait#2
wait#3
wait#4
wait#5

可以看出第二个调用立即返回,但它一直写入stdout。

如果您需要与孩子沟通,则需要使用fork并重定向STDINSTDOUT(和STDERR)。或者您可以使用IPC::Open2IPC::Open3个包。无论如何,在调用者退出之前等待孩子退出总是一个好习惯。

如果你想等待已执行的进程,你可以在Bash中尝试这样的事情:

#!/usr/bin/bash

cpid=()
for exe in script1 script2 script3; do
  $exe&
  cpid[$!]="$exe";
done

while [ ${#cpid[*]} -gt 0 ]; do
  for i in ${!cpid[*]}; do
    [ ! -d /proc/$i ] && echo UNSET $i && unset cpid[$i]
  done
  echo DO SOMETHING HERE; sleep 2
done

此脚本首先以异步方式启动脚本#并将pids存储在名为cpid的数组中。然后有一个循环;它浏览它们仍在运行(/ proc / exists)。如果不存在,则显示文本UNSET <PID>,并从阵列中删除PID。

它不是防弹的,好像DO SOMETHING HERE部分运行的时间很长,然后可以将相同的PID添加到另一个进程。但它在普通环境中效果很好。

但这种风险也可以降低:

#!/usr/bin/bash

# Enable job control and handle SIGCHLD
set -m
remove() {
  for i in ${!cpid[*]}; do
    [ ! -d /proc/$i ] && echo UNSET $i && unset cpid[$i] && break
  done
}
trap "remove" SIGCHLD

#Start background processes
cpid=()
for exe in "script1 arg1" "script2 arg2" "script3 arg3" ; do
  $exe&
  cpid[$!]=$exe;
done

#Non-blocking wait for background processes to stop
while [ ${#cpid[*]} -gt 0 ]; do
  echo DO SOMETHING; sleep 2
done

此版本使脚本能够在异步子进程退出时接收SIGCHLD信号。如果收到SIGCHLD,它将异步查找第一个不存在的进程。等待的while循环减少了很多。

答案 1 :(得分:2)

您可以使用threads异步启动Bash,

use threads;
my $t = async {
  return scalar `.. long running command ..`;
};

然后手动测试线程是否准备好加入,并以非阻塞方式获得输出,

my $output = $t->is_joinable() && $t->join();

答案 2 :(得分:2)

执行此操作的常规方法是使用fork。你将拥有你的脚本分叉,然后孩子会在Bash脚本上调用execsystem(取决于孩子是否需要处理Bash脚本的返回代码,或者以其他方式进行交互)用它)。

然后您的父母可能需要wait和/或SIGCHILD处理程序的组合。

如何处理它的具体细节在很大程度上取决于您的情况和确切需求。

相关问题