2017-11-25 77 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真正的節目。

相關問題