perl - 在后台执行,但限制执行次数

标签 perl bash background-process

我有一个程序对指定的日志文件执行一些操作,每次执行都会多次刷新到磁盘。我从一个 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/

相关文章:

regex - 如何在 Perl 中替换现有文件中的字符串

bash - awk 在读取行中的行为

linux - 当你想运行后台任务时,linux命令 "screen"和 "&"有什么区别?

perl - 如何在 Perl 的 Term::Shell 中自定义制表符补全?

perl - 我如何将 Unix/Sed/Perl 的音译 (tr) 应用于特定列?

Perl redis hset 没有返回正确的 retcode?

linux - 为复杂查询设置 Linux 命令别名

bash - 在 bash 函数中使用管道

ios - iOS 多任务 API/进程列表

ios - 后台获取间歇性数据丢失 - NSKeyedUnarchiver 可以从文档目录返回 nil 吗?