Toothrot Asked: 2019-01-09 15:12:13 +0800 CST2019-01-09 15:12:13 +0800 CST 2019-01-09 15:12:13 +0800 CST 使 zsh jobs -p 表现得像在 bash 中一样 772 有没有办法让jobs -pzsh 在 bash 中表现得像在 bash 中一样,即。只给 一个数字,这样可以吗kill $(jobs -p)? zsh jobs 1 个回答 Voted Best Answer Stéphane Chazelas 2019-01-09T15:46:24+08:002019-01-09T15:46:24+08:00 jobs关于作业的报告,它可以有多个进程。 交互时,作业位于进程组中,因此它们可以作为一个整体被暂停/恢复/中断。 jobs -p(在两者中zsh)bash返回每个作业的进程组 ID,而不是作业中所有进程的进程 ID。 当 shell 不以交互方式运行时(没有作业控制),shell 报告进程的 pid,如果有作业控制,则该进程组领导者(可能与$!顺便一提)。 $ sleep 1 | sleep 20 & [1] 29643 29644 $ jobs -p [1] + 29643 done sleep 1 | running sleep 20 zsh 报告说,对于 pgid 29643 的作业 2,zsh 启动了 2 个进程,其中一个已经完成,另一个仍在运行。 如果您只想获得类似 in 的 pgid bash,则可以通过管道进行: awk '/^\[/{print $3}' 如果要获取作业中的 pid(仅由 shell 启动的 pid),可以查看$jobstates特殊的关联数组: $ typeset jobstates jobstates=( 1 'running:+:29643=done:29644=running' ) 要提取仍在作业 1 中运行的进程的 pid: $ echo ${${(M)${(s/:/)jobstates[1]}:#*=running}%=*} 29644 现在,如果您想终止这些作业,您需要终止进程组(在交互式 shell 中),即整个作业,而不是作业中随机的一个进程。 你可以用 杀死 id 29643 的进程组kill -- -29643,kill 29643只会杀死 id 29643 的进程(在我们上面的例子中已经死了)。 在这里,传递作业号而不是 pid 或 pgid(在非交互式 shell 中不起作用)来杀死会更有意义。这就是工作编号的用途: kill %${(k)^jobstates} 不幸的是,我认为没有bash可靠的等价物。 bash-4.4$ sleep $(: ' > [213] ...') 2134 & [1] 29856 bash-4.4$ jobs [1]+ Running sleep $(: ' [213] ...') 2134 & 很难从中可靠地提取工作编号。(我还发现,while kill %; do continue; done由于某些竞争条件错误,它甚至不起作用)。 请注意,当不以交互方式运行时,没有作业控制,因此当您kill %1杀死 1 号作业时,该作业没有进程组。因此,作为一个穷人的近似值,shell(bash和)将改为单独zsh杀死它知道的每个进程。在我们上面的示例中,而不是: kill(-29643, SIGTERM); 它会做: kill(29643, SIGTERM); kill(29644, SIGTERM); 它不会杀死这两个进程自己产生的其他进程(如果有的话),尽管它仍然比像你的kill $(jobs -p)方法中只杀死 29643 更好。
jobs
关于作业的报告,它可以有多个进程。交互时,作业位于进程组中,因此它们可以作为一个整体被暂停/恢复/中断。
jobs -p
(在两者中zsh
)bash
返回每个作业的进程组 ID,而不是作业中所有进程的进程 ID。当 shell 不以交互方式运行时(没有作业控制),shell 报告进程的 pid,如果有作业控制,则该进程组领导者(可能与
$!
顺便一提)。zsh 报告说,对于 pgid 29643 的作业 2,zsh 启动了 2 个进程,其中一个已经完成,另一个仍在运行。
如果您只想获得类似 in 的 pgid
bash
,则可以通过管道进行:如果要获取作业中的 pid(仅由 shell 启动的 pid),可以查看
$jobstates
特殊的关联数组:要提取仍在作业 1 中运行的进程的 pid:
现在,如果您想终止这些作业,您需要终止进程组(在交互式 shell 中),即整个作业,而不是作业中随机的一个进程。
你可以用 杀死 id 29643 的进程组
kill -- -29643
,kill 29643
只会杀死 id 29643 的进程(在我们上面的例子中已经死了)。在这里,传递作业号而不是 pid 或 pgid(在非交互式 shell 中不起作用)来杀死会更有意义。这就是工作编号的用途:
不幸的是,我认为没有
bash
可靠的等价物。很难从中可靠地提取工作编号。(我还发现,
while kill %; do continue; done
由于某些竞争条件错误,它甚至不起作用)。请注意,当不以交互方式运行时,没有作业控制,因此当您
kill %1
杀死 1 号作业时,该作业没有进程组。因此,作为一个穷人的近似值,shell(bash
和)将改为单独zsh
杀死它知道的每个进程。在我们上面的示例中,而不是:它会做:
它不会杀死这两个进程自己产生的其他进程(如果有的话),尽管它仍然比像你的
kill $(jobs -p)
方法中只杀死 29643 更好。