【发布时间】:2017-11-28 22:56:55
【问题描述】:
我在 Perl 脚本中使用资源密集型程序 [特别是 rclone 将文件传输到 Google Drive]。
我还没有弄清楚我想如何调用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。)
【问题讨论】:
-
您可以以
sem -j N的身份调用GNU Parallel,它只允许N实例并行运行stackoverflow.com/a/46206137/2836621 和gnu.org/software/parallel/sem.html -
@Mark 啊,是的,完全忘记了那个有用的程序,它也是用 Perl 编写的。如果命令被多次调用,并且每次都在一个 不同的 脚本中,你知道信号量功能是否有效吗?也就是说——使用厕所类比——每个脚本实例是否都有自己的“厕所房间”,其他脚本实例无法访问,还是所有脚本实例都使用同一个“房间”?
-
是的,只要不同的程序都给出相同的
--id,就像我链接的答案一样。 -
如果服务器冻结是一个问题,您可以使用
--timeout杀死rclone,如果它花费的时间比预期的要长。
标签: perl