我在Perl脚本中使用资源密集型程序[具体为rclone
将文件传输到Google云端硬盘]。
我还没弄明白我要如何调用rclone
,因为我需要根据某些条件限制rclone
的实例数量(任何与相关的防止服务器过载,冻结,崩溃等)。我希望脚本等待apt系统"条件" (这可能是一段很长或无限期的时间),然后才能执行rclone
。
一些细节:
<A>
以供参考)。<A>
只返回一个脚本的值,因此对脚本或rclone
一无所知,除了它接受输入。<A>
无法更改(即更改<A>
超出我的意愿)<A>
以不同的间隔开火[即有时它会连续多次快速执行脚本(创建多个实例),有时它每隔几小时,几分钟就会触发一次。] rclone
不能直接改变(即再次,超出我的肯定)。rclone
(尽管我更喜欢它只是rclone
,因为脚本完成的处理是光,不需要限制。)pgrep
和ps
(除非绝对必要)。目前,我使用一个写得很差的bash脚本代替Perl脚本。 bash脚本实现了一个基本的(设计不良)&#34;检查/睡眠循环&#34;使用pgrep -wc
,sleep
,while
循环和if
语句。 (说实话,我甚至不认为bash脚本真的有用/帮助atm。)
答案 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
)。