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
$