今天遇到下面這個問題,在朋友們的幫助下終於成功了,在此表示感謝,同時把腳本貼出來
希望對大家有幫助,也希望朋友們可以優化這個腳本。
公司是做軟件開發的,程序員們的程序都要連接數據庫進行調試。可是他們的程序死了以後數據庫還是連接的,這樣一來系統的資源(內存)就會被占用被耗盡,於是我就
要經常去殺死已經死了的進程,可是這樣很麻煩,我想編一個shell腳本,可不知道如何下手,就請大蝦們幫幫忙了:-)
例如下面這些 323 325 。。。。。。。。。335 337 這些進程不能被殺,主要是要殺後面有(LOCAL=NO)的進程。 我應該怎麼做呀?
oracle 14527 1 0 10:22:39 ? 0:01 oraclextecs90 (LOCAL=NO)
oracle 16865 1 0 11:01:46 ? 0:06 oraclextecs90 (LOCAL=NO)
oracle 24346 1 0 00:00:52 ? 0:01 oraclextecs90 (LOCAL=NO)
oracle 24802 1 0 13:19:32 ? 0:03 oraclextecs90 (LOCAL=NO)
oracle 323 1 0 Apr 12 ? 0:01 ora_pmon_xtecs90
oracle 325 1 0 Apr 12 ? 1:35 ora_dbw0_xtecs90
oracle 327 1 0 Apr 12 ? 2:45 ora_lgwr_xtecs90
oracle 329 1 0 Apr 12 ? 2:45 ora_ckpt_xtecs90
oracle 331 1 0 Apr 12 ? 1:54 ora_smon_xtecs90
oracle 333 1 0 Apr 12 ? 0:00 ora_reco_xtecs90
oracle 335 1 0 Apr 12 ? 0:00 ora_s000_xtecs90
oracle 337 1 0 Apr 12 ? 0:00 ora_d000_xtecs90
oracle 14229 1 0 10:17:29 ? 0:00 oraclextecs90 (LOCAL=NO)
oracle 23079 1 0 22:58:31 ? 0:00 oraclextecs90 (LOCAL=NO)
oracle 1117 1 0 14:45:31 ? 0:47 oraclextecs90 (LOCAL=NO)
問題的補充:要殺連接已經超時了的進程(時間大於30分鐘),而不是要殺死所有的LOCAL=NO進程。
終於成功了!!!!!!!!!!!!!!!!!!
腳本如下:
ps -e -o pid -o etime -o args|grep LOCAL=NO>/tmp/tmpfile
cat /tmp/tmpfile|while read LINE
do
TIME=`echo $LINE|awk @#{print $2}@#`
TIME=`echo $TIME|awk -F: @#{print $1}@#`
if [ $TIME -gt 30 ]
then
echo $LINE >> /tmp/tmpflie2
fi
done
cut -c 1-5 /tmp/tmpfile2 |xargs -t -n1 kill -9
rm -f /tmp/tmpfile
rm -f /tmp/tmpfile2
然後把這個腳本寫進crontab,讓系統每30分鐘運行一次。