将作业控制号(%1)转换为pid,以便我可以杀死sudo的后台作业

时间:2017-11-15 19:34:17

标签: bash jobs

我经常在这种情况下结束:

$ sudo something &
[1] 21838
$# Oh, shoot, it's hung, and assume the pid has scrolled off the screen
$ kill %1
-bash: kill: (21838) - Operation not permitted
$# Ah, rats.  I forgot I sudo'ed that.
$# Wishful thinking:
$ sudo kill %1
kill: cannot find process "%1"
$# Now I have to use ps and find the pid I want.
$ ps -elf | grep something
$ ps -elf | grep sleep
4 S root     21838  1928  0  80   0 - 53969 poll_s 11:28 pts/2    00:00:00 sudo sleep 100
4 S root     21840 21838  0  80   0 - 26974 hrtime 11:28 pts/2    00:00:00 sleep 100
$ sudo kill -9 21838
[1]+  Killed                  sudo something

真的想知道是否有更好的工作流程。我真的很惊讶没有一个bash表达式将%1变成一个pid号。

是否存在将%1转换为其底层pid的bash技巧? (是的,我知道我可以在发布时使用$保存它!)

1 个答案:

答案 0 :(得分:4)

要获取作业的PID,请使用:count,其中jobs -p N是作业编号:

N

或者,更严格地回答您的问题,您可能会发现$ yes >/dev/null & [1] 2189 $ jobs -p 1 2189 $ sudo kill $(jobs -p 1) [1]+ Terminated yes > /dev/null 有用:它运行命令,用相应的PID替换作业规范:

-x

我个人认为$ yes >/dev/null & [1] 2458 $ jobs -x sudo kill %1 [1]+ Terminated yes > /dev/null 更直观,但我得到了-p的吸引力。