通过Alacritty快捷键执行脚本后,Obsidian随终端关闭问题排查
问题:通过Alacritty快捷键启动脚本后,关闭终端会终止Obsidian进程
我想用键盘快捷键执行一系列操作后启动Obsidian,当前使用Alacritty作为默认终端模拟器,运行的脚本如下:
#! /bin/bash echo Doing some heavy stuff sleep 5 echo Doing some other heavy stuff sleep 3 echo Opening Obsidian /home/enzo/tools/obsidian &
直接在终端执行该脚本时一切正常:会打印对应信息,且启动的Obsidian实例独立于终端,关闭终端不会影响它。但通过快捷键执行alacritty -e my_script.sh时,新Alacritty实例虽能正确执行脚本,但关闭终端后Obsidian也会被关闭。
我尝试了多种nohup、&和disown的组合,但均无效。shopt显示huponexit已设为off,理论上不会向子进程发送SIGHUP信号,这也是直接执行脚本正常的原因。
理想流程:
- 按下快捷键(如
CMD + N) - 新终端窗口打开并打印执行信息
- Obsidian启动并正常运行
- 关闭终端窗口后,Obsidian不受影响
请问问题出在哪里?我遗漏了什么?
解决方案
问题根源在于:通过alacritty -e启动脚本时,脚本进程是Alacritty的直接子进程,Obsidian又是脚本的子进程。当关闭Alacritty窗口时,它会向直接子进程(脚本)发送SIGTERM信号,脚本退出时仍会将信号传递给Obsidian,哪怕huponexit设为off也无法避免。
你可以通过以下两种方式让Obsidian完全脱离当前进程组,确保终端关闭后不受影响:
方式一:使用nohup + disown
修改脚本中启动Obsidian的代码为:
echo Opening Obsidian nohup /home/enzo/tools/obsidian > /dev/null 2>&1 & disown -h
nohup:让Obsidian忽略SIGHUP信号,同时将标准输出和错误重定向到/dev/null,避免生成多余的nohup.out文件&:让Obsidian后台运行disown -h:将Obsidian进程从当前shell的作业列表中移除,确保shell退出时不会向它发送任何信号
方式二:使用setsid
setsid会创建一个全新的会话,让Obsidian完全脱离当前终端的进程组,代码修改为:
echo Opening Obsidian setsid /home/enzo/tools/obsidian &
两种方式都能达成你的需求,可根据习惯选择。
内容的提问来源于stack exchange,提问作者Enzo Bonacina
相关产品推荐
相关产品推荐

