首页 > 解决方案 > 从 fish 脚本生成的 Neovim 进程立即终止

问题描述

我正在努力实现以下目标:

从 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执行了前两个后台作业。

然而,这并没有按预期工作。

mupdf并且第二个fish进程成功打开,也是如此nvim,但它在大约半秒后迅速关闭,之后我在控制终端窗口中得到以下内容:imagebote只是上述行源自的脚本的文件名)

2 个后台进程在那之后保持运行,我必须手动杀死它们。

我知道发送脚本是SIGHUP因为控制终端现在执行另一个应用程序(neovim),但为什么neovim在那之后关闭?


我还尝试disown在它们产生后对后台进程进行 ing,但这没有帮助。


我将如何解决这个问题?

标签: shellbackground-processfish

解决方案


问题是$last_pid,在鱼 3 中,和%last在鱼 2 中,默认情况下在脚本中不起作用。请参阅https://github.com/fish-shell/fish-shell/issues/5036status job-control full您可以通过将其放在脚本顶部或使用(jobs -lp)Glenn 提到的 hack来“修复”此问题。

关于仍在运行的后台进程......我无法重现。这个对我有用。但是,请注意,您nvim && kill只会运行killif nvim exits 且状态为零。如果你总是希望 kill 运行,你应该无条件地执行它。此外,您对信号二 (SIGINT) 的使用应该会产生预期的结果,但这是不寻常的。您应该使用kill -15或忽略该信号,在这种情况下它默认为 15 (SIGTERM)。


推荐阅读