Неовим процесс, порожденный рыбным сценарием, немедленно прекращается - PullRequest
0 голосов
/ 21 февраля 2019

Я пытаюсь добиться следующего:

из скрипта fish , откройте программу чтения PDF в качестве фонового задания.Как только он открывается, запускается другой процесс fish (который запускает бесконечный цикл while), также в качестве фонового задания.

Затем откройте редактор (neovim) и дайте ему возможность взять управлениеработающего терминала.После завершения neovim также приостановите предыдущие 2 фоновых задания (mupdf и другой процесс fish).

Моя текущая попытка выглядит следующим образом:

mupdf $pdfpath &                                                                                                                                            
set pid_mupdf $last_pid                                                                                                                                                                                                                                         
fish -c "while inotifywait ...; [logic to rebuild the pdf file..]; end" &                                                                                                                                          
set pid_sub $last_pid                                                                                                                                       
nvim $mdpath && kill -2 $pid_mudf $pid_sub 

Сначала я открываю mupdf в качестве фонового задания и сохраняю его PID в переменной.Затем я порождаю другой процесс с рыбой, также в качестве фоновой работы, и также сохраняю PID.

Далее я запускаю nvim (но не как фоновое задание, поскольку я намерен фактически управлять им), и после того, как пользователь завершает его, я изящно kill предыдущие 2 фоновых задания.

Однако это не работает должным образом.

mupdf и второй процесс fish успешно открывается, как и nvim, но он быстро закрывается примерно через полсекунды,после чего я получаю в окне управляющего терминала следующее: image (bote - это просто имя скрипта, из которого происходят строки выше)

2 фоновых процесса продолжают работать послеэто и я должен убить их вручную.

Я понимаю, что скрипт отправляется SIGHUP, потому что управляющий терминал теперь выполняет другое приложение (neovim), но почему после этого закрывается neovim?


Я также пытался disown запускать фоновые процессы после их запуска, но это не помогло.


Как мне решить эту проблему?

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

Проблема в том, что $last_pid для рыбы 3 и %last для рыбы 2 не работают по умолчанию в скриптах.См. https://github.com/fish-shell/fish-shell/issues/5036.. Вы можете «исправить» это, поместив status job-control full вверху скрипта или используя хак (jobs -lp), о котором упоминал Гленн.

Относительно того, что фоновый процесс остается запущенным ...Я не могу воспроизвести это.Меня устраивает.Тем не менее, обратите внимание, что ваш nvim && kill будет запускать kill только в том случае, если nvim выйдет с нулевым статусом.Если вы всегда хотите, чтобы уничтожение было выполнено, вы должны просто безоговорочно выполнить его.Кроме того, использование вами сигнала два (SIGINT) должно дать желаемый результат, но это необычно.Вы должны использовать kill -15 или просто пропустить сигнал, в этом случае он по умолчанию равен 15 (SIGTERM).

0 голосов
/ 21 февраля 2019

Вы получаете PID неправильно.Переменные $pid_mudf и $pid_sub пусты.Вы хотите

set pid_mupdf (jobs -lp)
...