限制incrond产生的并发进程数

时间:2013-08-07 21:19:47

标签: linux bash parallel-processing gnu inotify

我正在开发一个最终将驻留在CentOS(最新)虚拟机上的进程,我正在开发Ubuntu 12.04 LTS ......

所以,我有一个incron设置用IN_CLOSE_WRITE来监视我的drop文件夹,这样当一个文件被写入其中时,就会在该文件上运行一个相当资源密集的脚本(Images,imagemagick)。这一切都很好;除非一次删除太多文件。正如我所说的那样,脚本是资源密集型的,如果超过4个左右的实例同时运行,我的开发机器就会受到挫折(最终的虚拟机将更加强大,但我预见到可能会丢弃大量文件的实例)马上!)

危险的incrontab:

/path/to/dropfolder IN_CLOSE_WRITE bash /path/to/resourceintensivescript.sh $@/$#

所以问题是:如何限制incrond产生的工作数量?我尝试使用gnu parallel但无法弄清楚如何使其工作......

例如:

/path/to/dropfolder IN_CLOSE_WRITE parallel --gnu -j 4 bash /path/to/resourceintensivescript.sh $@/$#

似乎什么都不做:/

/path/to/dropfolder IN_CLOSE_WRITE;IN_NO_LOOP bash /path/to/resourceintensivescript.sh $@/$#

最终丢失文件:P

关于如何处理这个的想法?

2 个答案:

答案 0 :(得分:2)

您可以使用并行附带的sem实用程序:

/path/to/dropfolder IN_CLOSE_WRITE sem --gnu --id myjobname -j 4 /path/to/resourceintensivescript.sh $@/$#

答案 1 :(得分:2)

执行此操作的一个非常基本的方法是简单地使用grep并计算进程...类似于:

    processName=myprocess

    if [ $(ps -ef |grep -v grep|grep ${processName} |wc -l) -le 4 ]
    then
      do something
    fi

使用循环建议:

processName=myprocess

while true
do
  if [ $(ps -ef |grep -v grep|grep ${processName} |wc -l) -le 4 ]
  then
    do something
    break
  fi
  sleep 5
done