2017-01-27 89 views
0

在bash中,我想殺死一個進程以防它存在。Bash中的模式進程名匹配

我運行下面的命令:

netstat -lp | grep 9876 

其中具有輸出1個或0行。

在情況下,它的輸出1行,它看起來是這樣的:

tcp 0 0 *:9876 *:* LISTEN 18449/java 

所以我想以下幾點:

  1. 如果沒有輸出,不做任何事。
  2. 如果有輸出,我想模式匹配18849,所以java進程`。

然後我會殺了它。

雖然我不知道如何做1和2。有任何想法嗎?

回答

4

bash的正則表達式匹配是足夠了;無需grep

regex='LISTEN ([[:digit:]]+)/java' 
if [[ $(netstat -lp) =~ $regex ]]; then 
    kill "${BASH_REMATCH[1]}" 
fi 
4

使用在GNU xargs-r開關和GNU grepPCRE功能啓用,

netstat -lp | grep -oP '(?<=LISTEN).*(?=/java)' | xargs -r kill 

-r標誌xargs

-r, --no-run-if-empty 
     If the standard input does not contain any nonblanks, do not run the command. 
     Normally, the command is run once even if there is no input. This option is a GNU 
     extension. 
+0

不應該是'netstat -lp | grep -oP'(?<= LISTEN)。*(?=/java)'| xargs -r殺死'? – anishsane

+0

@anishsane:謝謝你的收穫!現在更新!你可以刪除它! – Inian