杀死一个暂停的进程?


17

我对以下内容感到有些困惑:

% 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

因此,我辞职只是“自己动手做”,想知道以后为什么这样做:

% fg
[1]  - continued   vim tmp
Vim: Caught deadly signal TERM
Vim: Finished.
zsh: terminated   vim tmp
%

哦!

确实有意义,现在考虑到这一点,vim必须运行它,以便告知信号处理程序退出并这样做。

但显然不是我想要的。

有没有一种方法可以在单个命令中“唤醒并退出”?即,内置的别名kill %N && fg %N

为什么在后台继续工作不起作用?如果我bg代替fg,Vim会一直活到我fg,这打破了我的直觉。

Answers:


20

vi-vi-vi是魔鬼的。您必须用火杀死它。或SIGKILL

kill -KILL %1

内置kills足以发送SIGCONT到挂起的进程,因此您不必自己执行此操作,但是如果进程阻塞了您正在发送的信号或处理该信号导致进程挂起,这将无济于事再次(如果后台进程尝试从终端读取数据,默认情况下,它将被发送SIGTTIN,如果未处理,它将暂停该进程)。


1
您到底为什么要使用SIGABRT?它旨在指示程序错误。SIGKILL就在这里,因为您想立即终止该程序,无论它是否想要。
吉尔斯(Gilles)'“ SO-别再邪恶了”

1
实际上,SIGTERM至少在没有处理程序的情况下,它看起来像现在正在唤醒睡眠进程。我认为它没有用这种方式工作,因为我记得有向bgfg东西之前,将接收信号和消失。但是我使用awk 'BEGIN{while(42){}}' &和进行了测试,并且strace kill $!只有一个kill(2)系统调用SIGTERM
彼得·科德斯

6

vim正在安装信号处理程序(并且可能还会设置sigprocmask(2))以忽略公共信号,以使正在编辑的任何文件都不会由于杂散control + 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

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


“您要怎么做才能使vim这样退出?” -没什么,那是我正在编辑的真正的“ tmp”文件。vim只是测试暂停方案的错误选择。
OJFord

1
“忽略常见信号,以使所有编辑的文件都不会由于杂散控制+ c或随机杀死信号而丢失”-但是,一旦我fg退出,它只要停止就停止了吗?
OJFord

2
@OllieFord:仅SIGKILL唤醒睡眠过程,以使其死亡。将信号发送到具有自定义处理程序的已暂停进程不会唤醒它。(SIGCONT当然,除了,继续信号。 bg然后fg发送SIGCONT。)
Peter Cordes
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.