1. 程式人生 > >linux 殭屍程序

linux 殭屍程序

  1. 產生背景
    買的雲主機,裝的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)