2017-11-25 79 views
3

我在Perl脚本中使用资源密集型程序[特别是将文件传输到Google Drive的rclone]。限制在Perl脚本中执行的程序的同时实例数(大于1)

我还没有搞清楚如何我想打电话给rclone,因为我需要限制的rclone实例基于一些条件(什么有关预防服务器超载,死机,崩溃等)的数量。我希望脚本在执行rclone之前等待apt系统的“条件”(这可能需要很长或无限的时间)。

一些细节:

  • 脚本本身基本上是通过包含由另一个程序(可能很多)的文件的文件或目录的路径(这个程序用Python写的 - 这个程序叫做<A>供参考)。
  • <A>仅向脚本返回一个值,因此对脚本或rclone一无所知,除了它接受输入。
  • <A>不能被改变(即改变<A>我是无法理解)
  • <A>火灾在不同的时间间隔[即有时它会连续快速多次执行脚本(创建多个实例),其他时候,它可能只触发一次,每隔几个小时,分钟等]
  • 假设rclone不能直接(即再次要么改变,超出我的肯定)。
  • 如果绝对必要,可以限制脚本实例的数量,而不是rclone(尽管我更喜欢它只是rclone,因为脚本所做的处理比较轻而且不需要限制)。
  • 模块很好用。
  • 我想避免使用类Unix操作系统命令等pgrepps(除非绝对必要)。

目前,我正在使用写得比较差的bash脚本来代替Perl脚本。在bash脚本实现了一个基本的(设计不佳)“检查/睡眠循环”使用pgrep -wcsleepwhile循环和if语句。 (说实话,我甚至不认为bash脚本真的有效/有助于atm。)

+0

您可以将** GNU并行**作为'sem -j N'调用,它只允许'N'个并行运行https://stackoverflow.com/a/46206137/2836621和https:// www.gnu.org/software/parallel/sem.html –

+0

@Mark啊,是的,完全忘了那个有用的程序,它也是用Perl编写的。如果命令被多次调用,并且每次都在_different_脚本中,您是否知道信号量功能是否有效?那就是---使用厕所比喻----每个脚本实例是否都有自己的“厕所空间”,其他脚本实例无法访问,或者所有脚本实例都使用同一个“房间”? – YenForYang

+1

是的,只要不同的程序都给出了与我链接的答案相同的'--id'。 –

回答

4

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

对于N实例(小N),我只想有N个的lockfiles - 有计划依次尝试每把锁,在一个循环;如果所有的锁已经被保持并且稍后重试1秒,则在一个循环中暂停。一旦锁定,运行rclone,然后在完成时释放锁定。


一个较好的方法是使用SysV的信号量,但是,除非你想有一个大的N,真正关心的响应时间或担心的调用者之间的公平性,这是不太可能是值得花时间学习他们。


如果你的脚本是不是要求rclone唯一的程序,然后将需要拦截所有的来电 - 而不是把这个代码在你的程序,可以通过它实现了并行约束如上然后调用包装更换rclone真正的节目。

相关问题