Linux

在後台睡眠時的 Unix 記憶體問題

  • November 1, 2017

我在不允許我使用cron. 因此,為了繞過這一點,我編寫了需要在這樣的確定時間執行的腳本:

while true
do
   ...
   ...
   sleep 1d #changes upon requirement of my script
done

我總是在後台啟動腳本nohup ./script.sh &

我的問題是,假設我在伺服器上執行了六/七個這樣的腳本——大多數時候它們都在睡覺。這sleep會消耗某種記憶體嗎?它會影響伺服器的性能嗎?有沒有有效的方法來處理這個?

是的——你正在用這些腳本消耗記憶體。您實際上已經使用記憶體執行了兩個程序:

  • 一個外殼(例如,bash)
  • sleep本身。

sleep將非常輕量級,但外殼可能會消耗幾兆字節的記憶體。在我的系統上,空閒的非互動式 bash 消耗 ~1MiB 和睡眠 0.7MiB。您可以檢查pstop(查看 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.allowand /etc/cron.deny;這些記錄在 crontab(1) 中。

引用自:https://unix.stackexchange.com/questions/401862