shell - 从 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
,但它在大约半秒后迅速关闭,之后我在控制终端窗口中得到以下内容:image(bote
只是上述行源自的脚本的文件名)
2 个后台进程在那之后保持运行,我必须手动杀死它们。
我知道发送脚本是SIGHUP
因为控制终端现在执行另一个应用程序(neovim
),但为什么neovim
在那之后关闭?
我还尝试disown
在它们产生后对后台进程进行 ing,但这没有帮助。
我将如何解决这个问题?
解决方案
问题是$last_pid
,在鱼 3 中,和%last
在鱼 2 中,默认情况下在脚本中不起作用。请参阅https://github.com/fish-shell/fish-shell/issues/5036。status job-control full
您可以通过将其放在脚本顶部或使用(jobs -lp)
Glenn 提到的 hack来“修复”此问题。
关于仍在运行的后台进程......我无法重现。这个对我有用。但是,请注意,您nvim && kill
只会运行kill
if nvim exits 且状态为零。如果你总是希望 kill 运行,你应该无条件地执行它。此外,您对信号二 (SIGINT) 的使用应该会产生预期的结果,但这是不寻常的。您应该使用kill -15
或忽略该信号,在这种情况下它默认为 15 (SIGTERM)。
推荐阅读
- python - 尝试使用统计库为大型数据集计算 mode() 时出现 StatisticsError
- java - 尝试验证 json 架构时出错
- java - R 继续使用 Java12 和 Broken JNI 错误
- mysql - 从 mariadb 中删除清除重复/乘法记录
- c# - 错误 CS0161 'RateController.GetRateById(long)':并非所有代码路径都返回值
- sql - 如果先前的 CTE 确实访问关系或错误字符串不包含参数,PostgreSQL 11 返回 null 而不是异常
- c# - 从 C# 中的嵌套 json 打印内容
- java - 使用 SpringBoot 和 Camel RabbitMQ 连接到不同的 RabbitMQ 实例
- android - Android O:不允许后台执行:有权限的自定义广播
- swift - 如何两次访问异步firebase