我使用以下代码段突然终止任何正在运行的java进程:
ps -ef | grep java | grep -v grep | awk "{print $2}" | xargs kill -9
我想把它放在一个可以在多台机器上运行的shell脚本中,但当我把它放进脚本并运行时,它会把awk中的$2作为传入参数。我尝试过对$进行单反斜杠、双反斜杠和三反斜杠,但都不起作用。
单次转义导致:
can't read "2": no such variable
双重转义导致:
awk: cmd. line:1 {print
awk: cmd. line:1: ^ unexpected newline or end of string
三次转义导致:
awk: cmd. line:1 {print
awk: cmd. line:1: ^ unexpected newline or end of string
因此,我正在寻找一种方法,将awk使用的$arguments传递到shell脚本中
你能试一下以下内容吗(灵感来自@James fine的回答(。
ps -ef | awk '/[j]ava/{cmd=(cmd?cmd OFS:"")$2} END{print "kill -9 " cmd}'
这将只打印kill命令,一旦您对它的结果(pid数字等(感到满意,然后运行以下命令来实际杀死pid。
ps -ef | awk '/[j]ava/{cmd=(cmd?cmd OFS:"")$2} END{print "kill -9 " cmd}' | bash
怎么样:
$ ps -ef | awk '/[j]ava/{print $2}'
样本输出:
28510
有一个命令可以做到这一点:
pkill java
pkill
接受-signal
(例如-9
(表示法,就像kill
一样,但我建议从较弱的信号开始,为终止的进程提供适当关闭的时间。我通常做-HUP
(挂断,-1
(,然后做标准(没有终止标志,-TERM
或-15
(,然后再做-9
(终止,-KILL
(。
如果你想在运行它之前知道它会做什么,你可以用列出匹配的进程ID
pgrep java
或了解更多详细信息:
pgrep -a java
(或pgrep java |xargs ps -f
,如果您喜欢(