我正在尝试编写一个bash脚本来查找正在运行的进程的PID然后发出kill命令。我有部分工作,但我面临的问题是可能有多个进程在运行。我想对找到的每个PID发出一个kill命令。
我认为我需要将每个PID放入一个数组中,但我不知道如何做到这一点。
到目前为止我所拥有的:
pid=$(ps -fe | grep '[p]rocess' | awk '{print $2}')
if [[ -n $pid ]]; then
echo $pid
#kill $pid
else
echo "Does not exist"
fi
这样做会在一行上返回所有PID,但我无法弄清楚如何将其拆分为数组。
答案 0 :(得分:20)
这是一个可能有帮助的小班轮
for pid in `ps -ef | grep your_search_term | awk '{print $2}'` ; do kill $pid ; done
只需将 your_search_term 替换为您要杀死的进程名称。
你也可以把它变成一个脚本并交换 your_search_term $ 1
编辑:我想我应该解释一下这是如何运作的。
后面的滴答声``收集它里面表达式的输出。在这种情况下,它将返回进程名称的pid列表。
使用for循环,我们可以迭代每个pid并终止进程。
EDIT2:用kill
替换kill -9答案 1 :(得分:2)
如果您要立即迭代结果并执行操作,则无需使用数组:
for pid in $(ps -fe | grep '[p]rocess' | grep -v grep | awk '{print $2}'); do
kill "$pid"
done
请注意,我们必须从要杀死的进程列表中排除grep
的pid。或者我们可以使用pgrep(1)
:
for pid in $(pgrep '[p]rocess'); do
kill "$pid"
done
如果您确实需要将pid存储在数组中,pgrep
就是这样做的:
pids=( $(pgrep '[p]rocess') )
回到杀戮过程。我们仍然可以做得更好。如果我们只是使用pgrep
来获取要杀死它们的进程列表,为什么不直接进入pgrep
的姐妹计划:pkill(1)
?
pkill '[p]rocess'
事实证明,根本不需要bash
脚本。
答案 2 :(得分:2)
除非你不知道命令名,否则不知道你为什么会要求一个杀人进程。大多数现代版本的ps都有标志
-C cmdlist
Select by command name. This selects the processes whose executable name is given in cmdlist.
和
-o format
User-defined format. format is a single argument in the form of
a blank-separated or comma-separated list, which offers a way to
specify individual output columns. The recognized keywords are
described in the STANDARD FORMAT SPECIFIERS section below.
Headers may be renamed (ps -o pid,ruser=RealUser -o
comm=Command) as desired. If all column headers are empty (ps
-o pid= -o comm=) then the header line will not be output.
Column width will increase as needed for wide headers; this may
be used to widen up columns such as WCHAN (ps -o pid,wchan=WIDE-
WCHAN-COLUMN -o comm). Explicit width control (ps opid,
wchan:42,cmd) is offered too. The behavior of ps -o pid=X,
comm=Y varies with personality; output may be one column named
"X,comm=Y" or two columns named "X" and "Y". Use multiple -o
options when in doubt. Use the PS_FORMAT environment variable
to specify a default as desired; DefSysV and DefBSD are macros
that may be used to choose the default UNIX or BSD columns.
所以你可以做到
ps -o pid= -C commandName
将返回名为commandName的所有进程的pid,并且更清晰,更快。或者杀死一个循环
while read -r pid; do
kill "$pid"
done < <(ps -o pid= -C commandName)
但实际上,你应该始终能够做到
> pkill commandName
答案 3 :(得分:0)
你的脚本似乎没问题,如果你想让每个pid列表都像新的那样替换:
echo $pid
#kill $pid
与
echo "$pid"
#kill "$pid"