Я был немного смущен:
% 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
Вима остаюсь в живых, пока я не fg
сломаю мою интуицию.
SIGTERM
пробуждение спящих процессов сейчас, по крайней мере, если у них нет обработчиков для этого. Я думаю, что раньше это не работало, так как я помню, что нужно былоbg
илиfg
что-то еще до того, как он получит сигнал и уйдет. Но я проверил сawk 'BEGIN{while(42){}}' &
, иstrace kill $!
, и есть только одинkill(2)
системный вызов, сSIGTERM
.vim
устанавливает обработчики сигналов (и, возможно, также настройкуsigprocmask(2)
), чтобы игнорировать общие сигналы, чтобы редактируемые файлы не терялись из-за случайного управляющего сигнала + c или случайного сигнала уничтожения. Более простая программа легко убивается:Создание
vim
выхода (безопасно) потребует обработчика сигнала,vim
который принимаетTERM
илиUSR1
что-то, сохраняет (или сбрасывает?) Любые буферы и т. Д. Что вы пытаетесь сделать, чтобы сделатьvim
выход таким, как этот?источник
vim
был просто непродуманный выбор программы для проверки подвески.fg
вышел, он остановился только на время приостановки?SIGKILL
пробуждает процесс сна, чтобы он мог умереть. Отправка сигналов в приостановленный процесс, который имеет собственные обработчики для них, не пробуждает его. (КромеSIGCONT
сигнала продолжения, конечно.bg
Иfg
отправитьSIGCONT
.)