列出作业 ID(而不是进程 ID)

列出作业 ID(而不是进程 ID)

shell 命令jobs支持-p仅获取进程 ID 列表的选项。有没有一种简单的方法可以仅获取作业 ID 列表?(我知道有,但我还不是真正的 shell 专家(目前))。

这对于来说非常方便kill,因为杀死一个作业 id 而不是一个进程 id 似乎也会杀死所有子进程。

答案1

你可以做这样的事情:

# create some background jobs
sleep 10 & sleep 10 & sleep 10 & sleep 10 & 
jobs | awk -F '[][]' '{print "%" $2}'

这将返回

%1
%2
%3
%4

我想这就是你所追求的。

答案2

这对于 kill 来说非常方便,因为杀死一个作业 id 而不是一个进程 id 似乎也会杀死所有子进程。

您可以采用不同的方法来执行此操作。

当它打印出 pid 时,你可以通过杀死它的进程组

你可以通过否定 pid 来实现这一点,例如

$ cat &
[1] 21273
$ kill -- -21273

您需要写--,否则-pid将被解释为信号(例如kill -9)。

例子:

$ man ls &
[1] 22267

$ ps j | head -1; ps j | grep 22267
 PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
18968 22267 22267 18968 pts/2    22327 T      500   0:00 man ls
22267 22281 22267 18968 pts/2    22327 T      500   0:00 /bin/sh /usr/bin/nroff -mandoc -Tutf8
22267 22282 22267 18968 pts/2    22327 T      500   0:00 less
22281 22286 22267 18968 pts/2    22327 T      500   0:00 groff -mtty-char -Tutf8 -mandoc
22286 22287 22267 18968 pts/2    22327 T      500   0:00 troff -mtty-char -mandoc -Tutf8
22286 22288 22267 18968 pts/2    22327 T      500   0:00 grotty

$ kill -- -22267
[1]+  Terminated              man ls

$ ps j | grep 22267

$

相关内容