Linux
在後台睡眠時的 Unix 記憶體問題
我在不允許我使用
cron
. 因此,為了繞過這一點,我編寫了需要在這樣的確定時間執行的腳本:while true do ... ... sleep 1d #changes upon requirement of my script done
我總是在後台啟動腳本
nohup ./script.sh &
。我的問題是,假設我在伺服器上執行了六/七個這樣的腳本——大多數時候它們都在睡覺。這
sleep
會消耗某種記憶體嗎?它會影響伺服器的性能嗎?有沒有有效的方法來處理這個?
是的——你正在用這些腳本消耗記憶體。您實際上已經使用記憶體執行了兩個程序:
- 一個外殼(例如,bash)
sleep
本身。
sleep
將非常輕量級,但外殼可能會消耗幾兆字節的記憶體。在我的系統上,空閒的非互動式 bash 消耗 ~1MiB 和睡眠 0.7MiB。您可以檢查ps
或top
(查看 RSS 列)——儘管其中很多實際上是庫之類的東西,這些庫在所有使用它們的程序之間共享。總而言之,每個都可能 <1MiB。在 Linux 上,您可以從
/proc/pid/status
(and/proc/pid/smaps
) 獲得更多詳細資訊;那些在Vm*
這裡很有趣。例如:bash -c 'grep Vm /proc/$$/status' VmPeak: 13380 kB VmSize: 13380 kB VmLck: 0 kB VmPin: 0 kB VmHWM: 972 kB VmRSS: 972 kB VmData: 220 kB VmStk: 132 kB VmExe: 208 kB VmLib: 2320 kB VmPTE: 48 kB VmPMD: 12 kB VmSwap: 0 kB
您可以看到 972 kB 的總 RSS(已用 RAM 量),其中 220 kB 是“數據”(通常不共享),132 kB 是堆棧(也不共享)。所以剩下的每個額外的 bash 都非常小。
一些建議:如果你不得不做一堆這樣的解決方法……你為什麼不能使用 cron?這是一種更簡單、更清潔的方法,出現意外錯誤的可能性要小得多(快!如何
sleep 1d
處理夏令時更改?如果您的睡眠提前返回會發生什麼,因為它是重新啟動/關閉的一部分?)。如果您的系統管理員擔心未經授權的人安排 cron 作業,請將他/她指向/etc/cron.allow
and/etc/cron.deny
;這些記錄在 crontab(1) 中。