2013-10-31 58 views
2

我想通過shell腳本終止進程,它給了我錯誤。以下是我試過到目前爲止:試圖通過shell腳本來終止進程

當我試圖殺死MEMCACHE它給我的錯誤,如「殺:沒有這樣的過程」,我用下面的命令:

ps -ef | grep "memcache" | awk '{print $2}' | xargs kill; 

,或者試圖象下面這樣:

kill -9 $(pidof memcache) 

我得到錯誤象下面這樣:「:參數必須是流程或作業ID」

當我直接在命令提示符下運行過程中運行:

[email protected]:~/parasol$ ps aux | grep memcache  
memcache 873 0.0 0.0 323220 1188 ?  Sl 22:56 0:00 /usr/bin/memcached -m 64 -p 11211 -u memcache -l 127.0.0.1 
ring  1714 0.0 0.0 9384 920 pts/0 S+ 23:45 0:00 grep --color=auto memcache 

我REFF到https://askubuntu.com/questions/239923/shell-script-to-9-kill-based-on-nameShell script to capture Process ID and kill it if exist

我的Ubuntu版本:

DISTRIB_ID=Ubuntu 
DISTRIB_RELEASE=12.04 
DISTRIB_CODENAME=precise 
DISTRIB_DESCRIPTION="Ubuntu 12.04.2 LTS" 
NAME="Ubuntu" 
VERSION="12.04.2 LTS, Precise Pangolin" 
ID=ubuntu 
ID_LIKE=debian 
PRETTY_NAME="Ubuntu precise (12.04.2 LTS)" 
VERSION_ID="12.04" 
+0

如果'pidof memcache'或'ps -ef | grep「memcache」| awk'{print $ 2}''?看起來沒問題。 – keltar

+0

你檢查http://stackoverflow.com/a/160926/2231893 – abasu

+0

pidof memcache不給任何東西,沒有錯誤沒有ID。 –

回答

8

NOTE:事實上

ps -ef | grep memcache 

會給兩行..

這樣你就可以走這條路

ps -ef | grep memcache | grep -v "grep" | awk '{print $2}' | xargs kill; 

這可以讓你一個確切PID

,如果我有我會打破它在2行開始

#!/bin/bash 
PID=`ps -ef | grep memcache | grep -v "grep" | awk '{print $2}'` 
echo $PID 
#to check PID is right 
kill -9 $PID 

將其保存在腳本文件中說明測試。SH

然後在終端

chmod +x test.sh 

然後

./test.sh 
+0

它給我錯誤在線我在哪裏存儲PID爲 第3行:PID:命令未找到 –

+0

我得到PID但無法存儲在變量中。 –

+0

什麼是o/p'ps -ef | grep memcache | grep -v「grep」| awk'{print $ 2}'' – Ashish

1

對於第一個命令,你看到有流程,使用grep命令的模式匹配。實際的memcached過程和您的grep過程。這可能是第一個命令行出錯的原因。

嘗試縮小搜索範圍,例如通過對搜索範圍進行搜索。 "^memcache.*/usr/bin/memcached"


第二錯誤的問題是,我們在調用pidof用戶名代替的進程名,因此命令基本上是kill -9沒有任何進程ID。而是嘗試pidof memcached獲取正確進程的進程ID。

+0

我試試這樣: sudo ps -ef | grep^memcache。*/usr/bin/memcached | awk'{print $ 2}'| xargs殺人; 給出錯誤: kill:操作不允許 my_test_batch.sh:第3行:$'\ r':命令沒有找到 –

+0

@SureshKamrushi你可以嘗試圍繞'grep'正則表達式引號嗎? –

+0

用引號給出錯誤「:沒有這樣的文件或目錄」。但我有memcached目錄在usr/bin/ –

2

您可以使用以下命令: pkill memcachedpgrep memcached | xargs kill -9killall memcached

pgrep,pkill - 根據名稱和其他屬性查找或發送進程。

+0

給我錯誤:「」.ROR:未知的信號名稱「9」 –

+0

@SureshKamrushi如果你不使用參數'-9',它是否工作? – BlackMamba

+0

沒有-9它給錯誤「kill:操作不允許 my_test_batch.sh:第3行:$'\ r':命令未找到」 –

2

你的第一個命令可能有機會殺死目標進程之前殺死自己。

要獲得可靠的方法,請運行pkill /usr/bin/memcachedpkill -9 /usr/bin/memcached,儘管後者是一種不好的做法。

0
ps -ef | grep "memcache" | awk '{print $2}' | xargs kill; 
PID=`ps -ef | grep memcache | grep -v "grep" | awk '{print $2}'` 
#... 

首先,你可以在這種情況下使用cut,而不是awk。無需使用坦克殺死蒼蠅;)

然後,爲什麼要殘酷地殺死memcache?你有一個守護進程來阻止它:

/etc/init.d/memcached stop 
service memcached stop