linux 殭屍程序
- 產生背景
買的雲主機,裝的docker,docker啟動一段時間後,同事反映不能寫入了,結果發現,根路徑100% ,新手原因,他啟動的時候沒有對映本地路徑,docker預設儲存位置是/var/lib/docker 下,在映象中寫入的時候導致根目錄沾滿,於是讓他聽掉對應的程序,發現已經停不了了,無賴之下直接停止了docker 服務,發現有個映象檔案已無法識別。
再次啟動systemctl start docker 無法啟動 ,通過journalctl -u docker.service 檢視發現 是儲存盤已滿的原因,還以為停止會釋放部分空間,再次啟動通過docker 命令刪除對應的image ,發現行不通
2.解決
備份/var/lib/docker,到儲存盤下 建立軟連指向/var/lib/docker
並啟動服務,後發現顯示正常,之前的images 也可以正常啟動
ln -s /data/docker-volume /var/lib/docker
systemctl start docker
docker ps
接下來是不是可以刪除之前的備份檔案了
rm -rf /var/lib/docker
報錯 device or resource busy
是不是有程序在寫
lsof 沒命令 擦
安裝:空間不足。擦擦(刪除一部分日誌 和無用的東西再次安裝)
發現檔案 mount
mount
/dev/dm- 1 /var/lib/docker/image/devicemapper/layerdb/mounts/f83573b2a54b9a9ba190639d29b99edde878d7ed12320e5d542f57d3e5caded0
umount
umount -v /dev/dm-1
發現還是無法刪除
mount發現
/var/lib/docker整路徑被掛載了
繼續umount
問題來了 檔案不見 空間沒釋放
df -h
/dev/vda1 20G 20G 20k 100% /
lsof |grep deleted
dockerd 9639 10884 root 11 uW REG 253,1 32768 34680840 /var/lib/docker.bak/volumes/metadata.db (deleted)
dockerd 9639 10884 root 18uW REG 253,1 16384 190524 /var/lib/docker.bak/builder/fscache.db (deleted)
備份的檔案還在刪除中,一般做法 kill 點對於程序就可以了,空間得等釋放
kill -9 9639
ps -ef |grep dockerd
root 12440 9831 0 14:31 pts/3 00:00:00 grep --color=auto dockerd
what??? 開始懷疑了
ps -auxH |grep dockerd
root 9639 0.0 0.0 0 0 ? Zsl Nov27 2:06 [dockerd] <defunct>
root 9639 0.0 0.2 1390188 43768 ? Dsl Nov27 2:07 [dockerd] <defunct>
root 12442 0.0 0.0 112668 976 pts/3 S+ 14:32 0:00 grep --color=auto dockerd
Zsl 是神馬? 檢視ps 命令可以看出 僵死,子程序,多線,這玩意兒試殭屍程序
USER 使用者名稱
UID 使用者ID(User ID)
PID 程序ID(Process ID)
PPID 父程序的程序ID(Parent Process id)
SID 會話ID(Session id)
%CPU 程序的cpu佔用率
%MEM 程序的記憶體佔用率
VSZ 程序所使用的虛存的大小(Virtual Size)
RSS 程序使用的駐留集大小或者是實際記憶體的大小,Kbytes位元組。
TTY 與程序關聯的終端(tty)
STAT 程序的狀態:程序狀態使用字元表示的(STAT的狀態碼)
R 執行 Runnable (on run queue) 正在執行或在執行佇列中等待。
S 睡眠 Sleeping 休眠中, 受阻, 在等待某個條件的形成或接受到訊號。
I 空閒 Idle
Z 僵死 Zombie(a defunct process) 程序已終止, 但程序描述符存在, 直到父程序呼叫wait4()系統呼叫後釋放。
D 不可中斷 Uninterruptible sleep (ususally IO) 收到訊號不喚醒和不可執行, 程序必須等待直到有中斷髮生。
T 終止 Terminate 程序收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU訊號後停止執行執行。
P 等待交換頁
W 無駐留頁 has no resident pages 沒有足夠的記憶體分頁可分配。
X 死掉的程序
< 高優先順序程序 高優先序的程序
N 低優先 級程序 低優先序的程序
L 記憶體鎖頁 Lock 有記憶體分頁分配並縮在記憶體內
s 程序的領導者(在它之下有子程序);
l 多程序的(使用 CLONE_THREAD, 類似 NPTL pthreads)
+ 位於後臺的程序組
START 程序啟動時間和日期
TIME 程序使用的總cpu時間
COMMAND 正在執行的命令列命令
NI 優先順序(Nice)
PRI 程序優先順序編號(Priority)
WCHAN 程序正在睡眠的核心函式名稱;該函式的名稱是從/root/system.map檔案中獲得的。
FLAGS 與程序相關的數字標識
什麼是殭屍程序:
在UNIX 系統中,一個程序結束了,但是他的父程序沒有等待(呼叫wait / waitpid)他, 那麼他將變成一個殭屍程序. 在fork()/execve()過程中,假設子程序結束時父程序仍存在,而父程序fork()之前既沒安裝SIGCHLD訊號處理函式呼叫 waitpid()等待子程序結束,又沒有顯式忽略該訊號,則子程序成為殭屍程序。可以通過top 或者ps命令都可以進行檢視
如何查殺呢:
主要是找到對應的父程序 殺死他,父程序死後,殭屍程序成為”孤兒程序”,過繼給1號程序init,init始終會負責清理殭屍程序.它產生的所有殭屍程序也跟著消失。
ps -A -ostat,ppid,pid,cmd | grep -e '^[Zz]'
或者
ps -e -o ppid,stat | grep Z | cut -d "" -f2
可以使用:
ps -A -ostat,ppid,pid,cmd | grep -e '^[Zz]'| xargs kill -9
或者
kill -HUP `ps -A -ostat,ppid | grep -e '^[Zz]' | awk '{print $2}'`
或者直接殺死
ps -ef | grep docker | grep -v grep | awk '{print "kill -18 " $3}'
-A 引數列出所有程序
-o 自定義輸出欄位 我們設定顯示欄位為 stat(狀態), ppid(程序父id), pid(程序id),cmd(命令)這四個引數
HUP(1)是讓程序掛起,睡眠;
kill (9)六親不認的殺掉
可我的運氣比較背
父程序是1 init 程序,怎麼辦呢
最好重啟了。。。。
linux signals
Signal Name Number Description
SIGHUP 1 Hangup (POSIX)
SIGINT 2 Terminal interrupt (ANSI)
SIGQUIT 3 Terminal quit (POSIX)
SIGILL 4 Illegal instruction (ANSI)
SIGTRAP 5 Trace trap (POSIX)
SIGIOT 6 IOT Trap (4.2 BSD)
SIGBUS 7 BUS error (4.2 BSD)
SIGFPE 8 Floating point exception (ANSI)
SIGKILL 9 Kill(can’t be caught or ignored) (POSIX)
SIGUSR1 10 User defined signal 1 (POSIX)
SIGSEGV 11 Invalid memory segment access (ANSI)
SIGUSR2 12 User defined signal 2 (POSIX)
SIGPIPE 13 Write on a pipe with no reader, Broken pipe (POSIX)
SIGALRM 14 Alarm clock (POSIX)
SIGTERM 15 Termination (ANSI)
SIGSTKFLT 16 Stack fault
SIGCHLD 17 Child process has stopped or exited, changed (POSIX)
SIGCONT 18 Continue executing, if stopped (POSIX)
SIGSTOP 19 Stop executing(can’t be caught or ignored) (POSIX)
SIGTSTP 20 Terminal stop signal (POSIX)
SIGTTIN 21 Background process trying to read, from TTY (POSIX)
SIGTTOU 22 Background process trying to write, to TTY (POSIX)
SIGURG 23 Urgent condition on socket (4.2 BSD)
SIGXCPU 24 CPU limit exceeded (4.2 BSD)
SIGXFSZ 25 File size limit exceeded (4.2 BSD)
SIGVTALRM 26 Virtual alarm clock (4.2 BSD)
SIGPROF 27 Profiling alarm clock (4.2 BSD)
SIGWINCH 28 Window size change (4.3 BSD, Sun)
SIGIO 29 I/O now possible (4.2 BSD)
SIGPWR 30 Power failure restart (System V)