我有一个程序对指定的日志文件执行一些操作,每次执行都会多次刷新到磁盘。我从一个 perl 脚本调用这个程序,它允许你指定一个目录,我在目录中的所有文件上运行这个程序。由于所有冲洗操作,这可能需要很长时间。
我想执行程序并在后台运行它,但我不希望管道执行数千次。这是一个片段:
my $command = "program $data >> $log";
myExecute("$command");
myExecute 基本上使用 system() 运行命令,以及一些其他日志记录/打印功能。我想做的是:
my $command = "program $data & >> $log";
这显然会创建一个大型管道。有什么方法可以限制一次有多少后台执行(最好使用&)? (我想尝试 2-4)。
最佳答案
#!/bin/bash
#
# lets call this script "multi_script.sh"
#
#wait until there are less then 4 instances running
#polling with interval 5 seconds
while [ $( pgrep -c program ) -gt 4 ]; do sleep 5; done
/path/to/program "$1" &
现在这样调用它:
my $command = "multi_script.sh $data" >> $log;
如果 bash 脚本等待,您的 perl 脚本将等待。
正面: 如果进程崩溃,它将被替换(数据当然是未处理的)
缺点: 您的 perl 脚本在启动实例之间等待片刻很重要 (也许是一秒钟的 sleep 时间) 因为调用脚本和通过 while 循环测试之间存在延迟。如果你生成它们的速度太快(系统垃圾邮件),你最终会得到比你预想的多得多的进程。
关于perl - 在后台执行,但限制执行次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20058628/