找到正在运行的进程的PID并将其存储为数组

时间:2014-01-31 00:24:06

标签: arrays linux bash

我正在尝试编写一个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,但我无法弄清楚如何将其拆分为数组。

4 个答案:

答案 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)

除非你不知道命令名,否则不知道你为什么会要求一个杀人进程。大多数现代版本的都有标志

    -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"