限制在Perl脚本中执行的程序的同时实例数(大于1)
我在Perl脚本中使用资源密集型程序[特别是将文件传输到Google Drive的rclone
]。限制在Perl脚本中执行的程序的同时实例数(大于1)
我还没有搞清楚如何我想打电话给rclone
,因为我需要限制的rclone
实例基于一些条件(什么有关预防服务器超载,死机,崩溃等)的数量。我希望脚本在执行rclone
之前等待apt系统的“条件”(这可能需要很长或无限的时间)。
一些细节:
- 脚本本身基本上是通过包含由另一个程序(可能很多)的文件的文件或目录的路径(这个程序用Python写的 - 这个程序叫做
<A>
供参考)。 -
<A>
仅向脚本返回一个值,因此对脚本或rclone
一无所知,除了它接受输入。 -
<A>
不能被改变(即改变<A>
我是无法理解) -
<A>
火灾在不同的时间间隔[即有时它会连续快速多次执行脚本(创建多个实例),其他时候,它可能只触发一次,每隔几个小时,分钟等] - 假设
rclone
不能直接(即再次要么改变,超出我的肯定)。 - 如果绝对必要,可以限制脚本实例的数量,而不是
rclone
(尽管我更喜欢它只是rclone
,因为脚本所做的处理比较轻而且不需要限制)。 - 模块很好用。
- 我想避免使用类Unix操作系统命令等
pgrep
和ps
(除非绝对必要)。
目前,我正在使用写得比较差的bash脚本来代替Perl脚本。在bash脚本实现了一个基本的(设计不佳)“检查/睡眠循环”使用pgrep -wc
,sleep
,while
循环和if
语句。 (说实话,我甚至不认为bash脚本真的有效/有助于atm。)
我会假设你的脚本是唯一运行rclone
。如果您只需要运行1个副本,you would just use a lockfile。
对于N实例(小N),我只想有N个的lockfiles - 有计划依次尝试每把锁,在一个循环;如果所有的锁已经被保持并且稍后重试1秒,则在一个循环中暂停。一旦锁定,运行rclone
,然后在完成时释放锁定。
一个较好的方法是使用SysV的信号量,但是,除非你想有一个大的N,真正关心的响应时间或担心的调用者之间的公平性,这是不太可能是值得花时间学习他们。
如果你的脚本是不是要求rclone
唯一的程序,然后将需要拦截所有的来电 - 而不是把这个代码在你的程序,可以通过它实现了并行约束如上然后调用包装更换rclone
真正的节目。
GNU并行可以在作业队列工作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
)通常就足够了。
您可以将** GNU并行**作为'sem -j N'调用,它只允许'N'个并行运行https://stackoverflow.com/a/46206137/2836621和https:// www.gnu.org/software/parallel/sem.html –
@Mark啊,是的,完全忘了那个有用的程序,它也是用Perl编写的。如果命令被多次调用,并且每次都在_different_脚本中,您是否知道信号量功能是否有效?那就是---使用厕所比喻----每个脚本实例是否都有自己的“厕所空间”,其他脚本实例无法访问,或者所有脚本实例都使用同一个“房间”? – YenForYang
是的,只要不同的程序都给出了与我链接的答案相同的'--id'。 –