要編寫一個腳本來自動清理僵尸進程,你可以使用 Bash 腳本結合一些常用的命令行工具,如 ps
、kill
和 wait
。以下是一個簡單的示例腳本,它會定期檢查并終止僵尸進程。
#!/bin/bash
# 定義檢查間隔時間(秒)
INTERVAL=60
# 無限循環,每隔 INTERVAL 秒檢查一次
while true; do
# 查找所有僵尸進程
zombie_processes=$(ps aux | awk '{if ($8 == "Z") print $2}')
# 如果有僵尸進程,則打印出來并終止它們
if [ ! -z "$zombie_processes" ]; then
echo "發現僵尸進程: $zombie_processes"
kill -9 $zombie_processes
fi
# 等待 INTERVAL 秒
sleep $INTERVAL
done
INTERVAL=60
表示每隔 60 秒檢查一次。while true; do ... done
創建一個無限循環。ps aux | awk '{if ($8 == "Z") print $2}'
使用 ps aux
查找所有進程,并通過 awk
過濾出狀態為 Z
(僵尸進程)的進程,打印它們的 PID。kill -9
強制終止它們。sleep $INTERVAL
讓腳本等待指定的時間間隔。cleanup_zombie_processes.sh
。chmod +x cleanup_zombie_processes.sh
。./cleanup_zombie_processes.sh
。kill -9
強制終止進程可能會導致數據丟失或其他問題,建議先嘗試 kill
命令而不帶 -9
選項。以下是一個改進版本,增加了日志記錄功能:
#!/bin/bash
# 定義檢查間隔時間(秒)
INTERVAL=60
# 定義日志文件路徑
LOGFILE="/var/log/cleanup_zombie_processes.log"
# 無限循環,每隔 INTERVAL 秒檢查一次
while true; do
# 查找所有僵尸進程
zombie_processes=$(ps aux | awk '{if ($8 == "Z") print $2}')
# 如果有僵尸進程,則打印出來并終止它們
if [ ! -z "$zombie_processes" ]; then
echo "$(date): 發現僵尸進程: $zombie_processes" >> $LOGFILE
kill -9 $zombie_processes
echo "$(date): 終止僵尸進程: $zombie_processes" >> $LOGFILE
else
echo "$(date): 沒有發現僵尸進程" >> $LOGFILE
fi
# 等待 INTERVAL 秒
sleep $INTERVAL
done
這個版本會在 /var/log/cleanup_zombie_processes.log
文件中記錄每次檢查的結果。