用fuser殺掉進程

一,為什麼要使用fuser?
   先說 fuser的作用,fuser能識別出正在對某個檔或埠訪問的進程大家想一下,還有哪個命令具備這個功能? 沒錯,是lsof,我們前面講過, lsof能夠找出正在對指定檔訪問的進程,那麼它們兩者之間有何區別?fuser有一個特別的用法在於它可以一次殺死那些正在訪問指定檔的進程。

二,如何使用fuser?

1,如何用fuser得到正在使用指定檔的進程?
     用法: fuser 文件
說明:它會把正在使用當前檔的進程id列出

[root@localhost lhd]# umount /
umount: /: device is busy.
(In some cases useful info about processes that use
the device is found by lsof(8) or fuser(1))
[root@localhost lhd]# fuser /
/:                       1rc     2rc     3rc     4rc     5rc     6rc     7rc    80rc    82rc    84rc    85rc   153rc   157rc   158rc
160rc   165rc   168rc  203rc   204rc   205rc   253rc   441rc   444rc   516rc   521rc   524rc   582rc   583rc
584rc   633rc  1052rc  1392rc  1394rc  1417rc  1597rc  1609rc  1617rc  1620rc  1683rc  1744rc  1783r  1785rc
1788rc  1806r  1808r  1810rc  1811rc  1812rc  1813rc  1814rc  1815rc  1848rc  1886rc  1899rc  1900rc  2001rc
......太多不一一列出

說明:
這些進程號後面的rc是什麼意思?

c 將此檔作為目前的目錄使用。
e 將此檔作為程式的可執行物件使用。
r 將此檔作為根目錄使用。
s 將此檔作為共用庫(或其他可裝載物件)使用

2,如何列出進程的詳細資訊,而不僅僅是進程id?
     用 -v參數即可
說明: -v:  含義是:verbose output,詳細的輸出資訊
例子:

[root@dev ~]# fuser /var/log
/var/log:             4196c
[root@dev ~]# fuser -v /var/log

USER        PID ACCESS COMMAND
/var/log:            root       4196 ..c.. bash

3,如何列出進程所屬的使用者?
     用 -u參數即可
說明: -u: 含義:display user IDs,顯示使用者id

例子:
[root@dev ~]# fuser -u /var/log
/var/log:             4196c(root)

4,如何殺死所有正在訪問指定檔的進程?
     用 -k參數即可
說明: -k:含義: kill processes accessing the named file

例子:

[root@localhost lhd]# fuser -v /root/install.log
使用者     進程號 許可權   命令
/root/install.log:   root       3185 f.... tail
[root@localhost lhd]# fuser -k /root/install.log
/root/install.log:    3185
[root@localhost lhd]# fuser -v /root/install.log

說明: -k參數能夠殺死所有的正在訪問指定檔的進程,所以用來殺進程時非常方便
說明之二: fuser如何殺死的進程?
它發送的是這個信號:SIGKILL

三,多學一點知識

1,fuser可以列出它所知的信號:
用 -l參數即可

例子:
[root@dev ~]# fuser -l
HUP INT QUIT ILL TRAP ABRT IOT BUS FPE KILL USR1 SEGV USR2 PIPE ALRM TERM
STKFLT CHLD CONT STOP TSTP TTIN TTOU URG XCPU XFSZ VTALRM PROF WINCH IO PWR SYS
UNUSED

2,fuser可以發送它已知的信號給訪問的指定檔進程而代替-k參數預設發送的SIGKILL
例如:只是掛起進程,那麼發送HUP信號就可以了

例子:
[root@localhost lhd]# fuser -v /root/install.log
使用者     進程號 許可權   命令
/root/install.log:   root       3347 f.... tail
[root@localhost lhd]# fuser -k -SIGHUP /root/install.log
/root/install.log:    3347
[root@localhost lhd]# fuser -v /root/install.log

==============================================================

發現半小時出現一次 fuser 這東西跑到 100%

查看 syslog

CRON[21666]: (root) CMD (  [ -x /usr/lib/php5/maxlifetime ] && [ -d /var/lib/php5 ] && find /var/lib/php5/ -depth -mindepth 1 -maxdepth 1 -type f -cmin +$(/usr/lib/php5/maxlifetime) ! -execdir fuser -s {} 2>/dev/null \; -delete)

是由 cron 來處理的東西

上網查了一下說是 11.10 的附上的這隻 php5 cron 的BUG

據說改成 11.04 的就好了

試試看先

# 09,39 * * * * root [ -x /usr/lib/php5/maxlifetime ] && [ -d /var/lib/php5 ] && find /var/lib/php5/ -depth -mindepth 1 -maxdepth 1 -type f -cmin +$(/usr/lib/php5/maxlifetime) ! -execdir fuser -s {} 2>/dev/null \; -delete

09,39 * * * * root [ -x /usr/lib/php5/maxlifetime ] && [ -d /var/lib/php5 ] && find /var/lib/php5/ -depth -mindepth 1 -maxdepth 1 -type f -cmin +$(/usr/lib/php5/maxlifetime) -delete

mark 起來的是 11.10的

By tony

自由軟體愛好者~喜歡不斷的思考各種問題,有新的事物都會想去學習嘗試 做實驗並熱衷研究 沒有所謂頂天的技術 只有謙虛及不斷的學習 精進專業,本站主要以分享系統及網路相關知識、資源而建立。 Github http://stnet253.github.io

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料