限制在Perl脚本中执行的程序的同时实例数(到> 1)

时间:2017-11-25 20:23:20

标签: perl

我在Perl脚本中使用资源密集型程序[具体为rclone将文件传输到Google云端硬盘]。

我还没弄明白我要如何调用rclone,因为我需要根据某些条件限制rclone的实例数量(任何与相关的防止服务器过载,冻结,崩溃等)。我希望脚本等待apt系统"条件" (这可能是一段很长或无限期的时间),然后才能执行rclone

一些细节:

  • 脚本本身实际上是通过另一个程序传递包含(可能很多)文件的文件或目录路径(这个用Python编写的程序 - 调用此程序<A>以供参考)。
  • <A>只返回一个脚本的值,因此对脚本或rclone一无所知,除了它接受输入。
  • <A>无法更改(即更改<A>超出我的意愿)
  • <A>以不同的间隔开火[即有时它会连续多次快速执行脚本(创建多个实例),有时它每隔几小时,几分钟就会触发一次。]
  • 假设rclone不能直接改变(即再次,超出我的肯定)。
  • 如果绝对必要,可以限制脚本的实例数而不是rclone(尽管我更喜欢它只是rclone,因为脚本完成的处理是光,不需要限制。)
  • 可以使用模块。
  • 我希望避免使用类似Unix的操作系统命令,例如pgrepps(除非绝对必要)。

目前,我使用一个写得很差的bash脚本代替Perl脚本。 bash脚本实现了一个基本的(设计不良)&#34;检查/睡眠循环&#34;使用pgrep -wcsleepwhile循环和if语句。 (说实话,我甚至不认为bash脚本真的有用/帮助atm。)

2 个答案:

答案 0 :(得分:4)

我会假设您的脚本是唯一运行rclone的脚本。如果您只想运行一个副本,you would just use a lockfile

对于N个实例(对于小N),我只有N个锁定文件 - 让程序在循环中依次尝试每个锁;如果所有锁都已被保持,则暂停,然后在循环中重试1秒。一旦锁定,运行rclone,然后在完成后释放锁。

更合理的方法是使用SysV信号量,但是,除非你想要一个大的N,真正关心响应时间或担心呼叫者之间的公平性,否则学习它们的时间可能不值得。

如果您的脚本不是唯一调用rclone的程序,那么需要拦截所有调用 - 而不是将此代码放在您的程序中,可以用实现并行性约束的包装器替换rclone上面然后调用真正的程序。

答案 1 :(得分:2)

GNU Parallel可以在作业队列https://www.gnu.org/software/parallel/man.html#EXAMPLE:-GNU-Parallel-as-queue-system-batch-manager

上工作
true >jobqueue; tail -n+0 -f jobqueue | parallel -j10 --timeout 1h rclone

然后运行<A>

<A> >> jobqueue

您现在必须清理jobqueue。但除非<A>产生大量数据,否则通常只需在每次重启时将其归零(true >jobqueue)。