杀死挂起的进程?

OJF*_*ord 24 kill signals process-management background-process

我有点困惑:

% vim tmp
zsh: suspended   vim tmp
% kill %1
% jobs
[1]  + suspended   vim tmp
% kill -SIGINT %1
% jobs
[1]  + suspended   vim tmp
% kill -INT %1
% jobs
[1]  + suspended   vim tmp
Run Code Online (Sandbox Code Playgroud)

所以我辞职只是“自己做”,后来想知道为什么:

% fg
[1]  - continued   vim tmp
Vim: Caught deadly signal TERM
Vim: Finished.
zsh: terminated   vim tmp
%
Run Code Online (Sandbox Code Playgroud)

哦!

确实有道理,现在我想起来了,它vim必须运行才能让它的信号处理程序被告知退出,并这样做。

但显然不是我想要的。

有没有办法在单个命令中“唤醒和退出”?即,内置别名kill %N && fg %N

为什么在后台恢复不起作用?如果 Ibg而不是fg,Vim 会一直活着直到 I fg,这打破了我的上述直觉。

PSk*_*cik 26

vi-vi-vi属于魔鬼。你必须用火杀死它。或者SIGKILL

kill -KILL %1
Run Code Online (Sandbox Code Playgroud)

内置的kills 足以发送SIGCONT到挂起的进程,这样你就不必自己做,但是如果进程阻塞了你发送的信号或者处理信号导致进程被挂起,这将无济于事再次(如果后台进程尝试从终端读取,默认情况下,它将被发送SIGTTIN,如果未处理则暂停进程)。


thr*_*rig 6

vim正在安装信号处理程序(并且可能还设置sigprocmask(2))以忽略常见信号,以便任何正在编辑的文件都不会因杂散控制+c 或随机终止信号而丢失。一个更简单的程序很容易被杀死:

% cat busyloop.c
int main(void) {
for (;;) { ; }
return 0;
}
% make busyloop
cc     busyloop.c  -o busyloop
% ./busyloop
^Z
zsh: suspended  ./busyloop
% kill %1
%
[1]  + terminated  ./busyloop
Run Code Online (Sandbox Code Playgroud)

制作vim出口(安全),在需要的信号处理vim,接受TERM或者USR1什么的,保存(或丢弃?)任何你到底做需要做缓冲区等vim这样的出口?

  • @OllieFord:只有`SIGKILL` 会唤醒一个睡眠进程,以便它可以死亡。向具有自定义处理程序的挂起进程发送信号不会*不会*唤醒它。(当然,除了`SIGCONT`,还有continue 信号。`bg` 和`fg` 发送`SIGCONT`。) (2认同)