我正在尝试编写一个bash脚本以查找运行过程的pid,然后发出kill命令。我有部分工作,但是我面临的问题是,可能有一个以上的过程运行。我想向发现的每个PID发出杀伤命令。
我认为我需要将每个pid放在一个数组中,但是关于如何做到这一点。
到目前为止我拥有的东西:
pid=$(ps -fe | grep '[p]rocess' | awk '{print $2}')
if [[ -n $pid ]]; then
echo $pid
#kill $pid
else
echo "Does not exist"
fi
这将要做的是返回一行上的所有pids,但我不知道如何将其拆分为数组。
这是一个可能有帮助的小衬里
for pid in `ps -ef | grep your_search_term | awk '{print $2}'` ; do kill $pid ; done
只需用要杀死的过程名称替换 your_search_term 。
您也可以将其制作到脚本中,然后交换 your_search_term for $ 1
编辑:我想我应该解释一下这是如何工作的。
背滴``从其内部的表达式收集输出。在这种情况下,它将返回流程名称的PID列表。
使用for循环我们可以迭代每个pid并杀死该过程。
edit2:用Kill
如果要立即迭代结果并执行操作,则不需要使用数组:
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
脚本。
不知道为什么除非您不知道命令名称,否则您为什么要杀死一个过程。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
将返回所有名称命令名称名称的所有进程的pid,并且更清洁,更快。或杀死循环
while read -r pid; do
kill "$pid"
done < <(ps -o pid= -C commandName)
但实际上,您应该总是能够做
> pkill commandName
您的脚本看起来不错,如果您想将每个PID列表放在新的类似的情况下,请替换:
echo $pid
#kill $pid
echo "$pid"
#kill "$pid"