Ank*_*nko 9 zsh signals background-process disown
我的拒绝前台进程的方法太费力了。
假设我在zsh
的前台有一个进程。我想要disown
它,这样我就可以关闭外壳,而不会向进程发送SIGHUP
.
目前,我从Ctrl+开始z到后台并暂停进程,然后
$ disown
disown: warning: job is suspended, use `kill -CONT -32240' to resume
$ kill -CONT -32240
$
Run Code Online (Sandbox Code Playgroud)
-然后我可以关闭终端。
我怎样才能自动化?理想情况下,我希望能够按Ctrl+j或其他东西来立即否认正在运行的进程。或者第二好的,我希望能够在SIGCONT
挂起后运行单个命令来拒绝和进程。
Ank*_*nko 13
拥有一个全局键绑定来拒绝前台进程是不可能的:按键是由前台进程接收的,而不是由 shell 接收的。如果你想否认它,你需要先用Ctrl+暂停z它。
但是,事实证明有一个 zsh 选项可以加快拒绝然后继续:使用setopt AUTO_CONTINUE
,disown
也会自动发送SIGCONT
.
所以你可以把它归结为C-z
disown
.
Gil*_*il' 13
当您在终端中按Ctrl+Z时,这会导致前台进程组接收信号 SIGTSTP(假设终端处于熟模式并且默认键绑定已就位)。如果进程没有为 SIGTSTP 设置信号处理程序,这会导致进程挂起(即使进程设置了信号处理程序,它通常在挂起自己之前只做少量处理)。当一个进程被杀死、挂起或恢复时,它的父进程会通过一个 SIGCHLD 信号得到通知;这就是导致外壳显示新提示的原因,并且可能会显示类似[1] + 1234 suspended foo
. 信息流是
关键?暂停 ?壳
而不是
钥匙?贝壳 ?暂停,
因此您无法为Ctrl+配置不同的反应Z。
您可以为 SIGCHLD 设置陷阱,但是当作业是当前前台作业时,不会执行陷阱。在大多数情况下,这意味着陷阱仅在后台作业终止时执行,而不是在前台作业终止时执行。但这也意味着您无法对前台工作的暂停做出反应。
您可以通过设置precmd
将作业状态与上次precmd
运行保存的状态进行比较的挂钩来间接对后台作业的更改做出反应。但我不知道你能用它做什么:只能有一个挂起键,所以你需要一些额外的信息来知道这个过程是要暂停、后台运行还是取消。
我已经设置了 zsh,以便在空提示下按Ctrl+Z将当前工作作为背景。这让我可以按两次Ctrl+Z将前台作业放入后台,并且只有短暂的暂停。
fancy-ctrl-z () {
if [[ $#BUFFER -eq 0 ]]; then
bg
zle redisplay
else
zle push-input
fi
}
zle -N fancy-ctrl-z
bindkey '^Z' fancy-ctrl-z
Run Code Online (Sandbox Code Playgroud)
disown
如果你愿意,你可以打电话。或者您可以安排第三个Ctrl+Z调用disown
以下未经测试的修改。
fancy-ctrl-z () {
if [[ $#BUFFER -eq 0 ]]; then
if (($fancy_ctrl_z_already_bg)); then
disown
else
bg
fancy_ctrl_z_already_bg=1
fi
zle redisplay
else
zle push-input
fi
}
zle -N fancy-ctrl-z
bindkey '^Z' fancy-ctrl-z
fancy_ctrl_z_precmd () {
fancy_ctrl_z_already_bg=0
}
precmd_functions+=fancy_ctrl_z_precmd
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3404 次 |
最近记录: |