我有一个程序,它对指定的日志文件执行一些操作,每次执行都会多次刷新到磁盘。我是从perl脚本调用这个程序的,它允许您指定一个目录,并且我在目录中的所有文件上运行这个程序。这可能需要很长时间,因为所有的冲。
我想要执行这个程序并在后台运行它,但是我不希望这条管道长时间被执行。这是一个片段:
my $command = "program $data >> $log";
myExecute("$command");myExecute基本上使用system()以及其他一些日志/打印功能运行该命令。我想做的是:
my $command = "program $data & >> $log";这显然会产生一条大管道。是否有任何方法来限制一次有多少后台执行(最好使用&)?(我想试试2-4)。
发布于 2013-11-19 01:38:31
#!/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脚本将等待。
阳性:如果进程崩溃,它将被替换(当然,数据是未经处理的)。
缺点:脚本在启动实例(可能是一秒钟的睡眠时间)之间等待片刻是很重要的,因为调用脚本与通过while循环测试之间存在延迟。如果你太快地产生它们(系统垃圾邮件),你最终会得到比你预期的更多的进程。
发布于 2013-11-19 02:25:20
如果你能改变
my $command = "program $data & >> $log";转到
my $command = "cat $data >>/path/to/datafile";(甚至更好:将$data直接从perl追加到/path/ to /datafile )
当脚本完成后,最后一行将是:
System("/path/to/quadslotscript.sh");然后我在这里得到了脚本quadslotscript.sh:
守则:
#!/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 ; donehttps://stackoverflow.com/questions/20058628
复制相似问题