前言

Cronjob 很頻繁的被使用在工作排程上,不過如果無法預期排程中的 process 的執行時間,當發生 process 的執行時間超過排程預期的時候,可能會重複執行多個重複的 process,如此不但會造成系統資源的浪費,也可能發生無法預期的錯誤。

為了要友善管理背景執行的 process,在網路上可以找到用 Python 撰寫的 Supervisor: A Process Control System ,Supervisor 是一套完整的 system process monitoring 工具。但是這套工具的設計是以一支 daemon process 去管理 process,並透過設定檔來操作管理 process 的細節,雖然提供很多強大的附加功能,但主要是為了維持服務的穩定,這和我想要減少使用系統資源的目標有點不同。

而且這樣的工具會有一個明顯的盲點,因為 Supervisor 是利用 daemon process 去管理 process,那是不是也需要有 process 來管理 Supervisor 的 daemon process?所以最後我沒有採用 Supervisor 這套工具,而選擇自己寫一支簡單的程式。

Process Count Supervisor

前言說完了,回到我要解決的問題,放在要如何簡單管理 process 數目,並且盡可能減少額外要執行的 process,以此概念下完成了 Process Count Supervisor 這支程式。

  • 每次執行時才帶入需要的 process 指令,不需要保持常駐的 daemon
  • 簡單透過參數限制最多執行的 process 數目

Simple Use Case

新建一個睡眠時間超過一分鐘的 shell script sleep.sh:

echo '#!/bin/bash' > /home/yourname/sleep.sh
echo 'sleep 200' > /home/yourname/sleep.sh
chmod +x /home/yourname/sleep.sh

設定 cronjob 為每分鐘執行一次,並使用 pcs.py (Process Count Supervisor) 來管理 sleep.sh:

crontab -e
*/1 * * * * /home/yourname/pcs.py -m 1 /home/yourname/sleep.sh > /dev/null 2>&1

因為每分鐘執行一次的 sleep.sh 會睡眠超過一分鐘,所以理論上兩分鐘會擁有兩支 sleep.sh 同時在背景執行,但是在 pcs.py 的管理之下,sleep.sh 會維持同時間只有一支在背景執行。

詳細使用教學可以參照 Github repository 的說明。

Github repository link: https://github.com/hansliu/process-count-supervisor