首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在后台执行,但限制执行次数。

在后台执行,但限制执行次数。
EN

Stack Overflow用户
提问于 2013-11-18 21:47:11
回答 2查看 273关注 0票数 3

我有一个程序,它对指定的日志文件执行一些操作,每次执行都会多次刷新到磁盘。我是从perl脚本调用这个程序的,它允许您指定一个目录,并且我在目录中的所有文件上运行这个程序。这可能需要很长时间,因为所有的冲。

我想要执行这个程序并在后台运行它,但是我不希望这条管道长时间被执行。这是一个片段:

代码语言:javascript
复制
my $command = "program $data >> $log";
myExecute("$command");

myExecute基本上使用system()以及其他一些日志/打印功能运行该命令。我想做的是:

代码语言:javascript
复制
my $command = "program $data & >> $log";

这显然会产生一条大管道。是否有任何方法来限制一次有多少后台执行(最好使用&)?(我想试试2-4)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-11-19 01:38:31

代码语言:javascript
复制
#!/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" &

现在这样称呼它:

代码语言:javascript
复制
my $command = "multi_script.sh $data" >> $log;

如果bash脚本等待,您的perl脚本将等待。

阳性:如果进程崩溃,它将被替换(当然,数据是未经处理的)。

缺点:脚本在启动实例(可能是一秒钟的睡眠时间)之间等待片刻是很重要的,因为调用脚本与通过while循环测试之间存在延迟。如果你太快地产生它们(系统垃圾邮件),你最终会得到比你预期的更多的进程。

票数 3
EN

Stack Overflow用户

发布于 2013-11-19 02:25:20

如果你能改变

代码语言:javascript
复制
my $command = "program $data & >> $log";

转到

代码语言:javascript
复制
my $command = "cat $data >>/path/to/datafile";

(甚至更好:将$data直接从perl追加到/path/ to /datafile )

当脚本完成后,最后一行将是:

代码语言:javascript
复制
System("/path/to/quadslotscript.sh");

然后我在这里得到了脚本quadslotscript.sh

  1. 4个执行槽已启动,并一直保持到结束。
  2. 所有插槽都从相同的数据文件中获取输入。
  3. 当插槽准备好处理时,它将读取一个要处理的新条目。 直到数据文件/队列为空
  4. 只有在完成所有工作时,才能在执行过程中进行可执行的查找。

守则:

代码语言:javascript
复制
#!/bin/bash

#use the datafile as a queue where all processes get their input
exec 3< "/path/to/datafile"

#4 seperate processes 
while read -u 3 DATA; do "/path/to/program $DATA" >>$log; done &
while read -u 3 DATA; do "/path/to/program $DATA" >>$log; done &
while read -u 3 DATA; do "/path/to/program $DATA" >>$log; done &
while read -u 3 DATA; do "/path/to/program $DATA" >>$log; done &

#only exit when 100% sure that all processes ended
while pgrep "program" &>"/dev/null" ; do wait ; done
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20058628

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档