
我有一台運行 ubuntu 14.04 的伺服器。在 /var/log/auth.log 中有某種每小時運行一次的自動化進程,我想找出該進程是什麼。
我已經確定沒有任何使用者安排任何 cron 作業。我所要做的就是每小時在 auth.log 中查看以下範例行:
Dec 2 03:17:01 fi CRON[23537]: pam_unix(cron:session): session opened for user root by (uid=0)
Dec 2 03:17:01 fi CRON[23537]: pam_unix(cron:session): session closed for user root
Dec 2 04:17:01 fi CRON[23557]: pam_unix(cron:session): session opened for user root by (uid=0)
關於如何追蹤這個問題有什麼想法嗎?
答案1
我已經確定沒有任何使用者安排任何 cron 作業。
/etc/crontab
您可能錯過了和中的系統範圍的 cron 作業/etc/cron.d/*
。
如果沒有,您可以附加strace
到 cron 進程以查看它讀取了哪些文件,或者執行了哪些命令:
strace -p 23537 -e file
strace -p 23537 -f -e execve [-s 10000]
在較舊的系統中,cron 可能會在沒有自動重新載入支援的情況下進行編譯,因此如果有人從 /etc/crontab 手動刪除作業但沒有重新載入 cron,它們將繼續運行,直到有人觸發重新載入。
答案2
您可以使用atop
。
安裝後,它將開始自動記錄進程及其資源使用情況,並將資料寫入日誌檔案。您可以稍等一下以收集足夠的數據,然後檢查日誌或解析它們。
例如,收集日誌後,要檢查正在運行的進程,我建議使用以下命令:
atop -r /var/log/atop/atop_<current date> -b 03:16 -e 03:18 -P PRG | grep -P 'PRG.*\s23557\s\('
這會:
- 讀取當天 03:16 到 03:18 之間的日誌文件
- 將資料輸出到機器可解析的輸出中,其中包含有關進程的通用資料(這將包括進程名稱)
- 搜尋 PID 為 23557 的進程所在的行,以便您可以看到進程名稱是什麼(用括號括起來)。 grep 模式是為了獲得更高的準確性 - 該行始終以 開頭
PRG
,值列以空格分隔(PID 是一個單獨的列),PID 後面的列是括在括號中的進程名稱(以 開頭(
)。