2

今晚一直在修修补补,但无法找到解决方案。

我写了一个小脚本,我用“popup-shell”调用它并fzf用来选择一个文件。我将此文件传递给marktextappimage 并取消该进程,然后“弹出外壳”关闭。不幸的是,在 shell 关闭时,marktext应用程序也关闭了。

我认为问题在于可执行文件被正确地拒绝,但 appimage mount-stuff 仍然是“popup-shell”的子处理。一旦“popup-shell”关闭,appimage mount-stuff 也会关闭,这反过来会导致marktext关闭。

进程树式:

popup-shell
  +- script that spawns marktext appimage
  |  +- /tmp/.mount_markXXXXX/marktext ...
  |  |  +- /tmp/.mount_markXXXXX/marktext ...
  |  |     +- /tmp/.mount_markXXXXX/marktext ...
  |  |        +- /tmp/.mount_markXXXXX/marktext ...
  |  +- /tmp/.mount_markXXXXX/marktext ...
  |  |  +- /tmp/.mount_markXXXXX/marktext ...
  |  +- /tmp/.mount_markXXXXX/marktext ...
  |  +- /tmp/.mount_markXXXXX/marktext ...
marktext ...

实际的marktext二进制文件似乎已被正确否认。

该脚本并不复杂,只需运行:

marktext <file> &
disown -h %1

任何指针将不胜感激。

4

1 回答 1

1

您可以使用

setsid -f marktext <file>

在新会话中运行程序。

-f选项将告诉setsid立即分叉到后台。快速测试表明,它disown仍然会保留父进程,而setsid不会

sleep 100 &
disown -h %1
ps -C sleep -oppid,pid

输出

PPID     PID
32772   32806

setsid -f sleep 100
ps -C sleep -oppid,pid

输出

PPID     PID
1       32814

一些进一步的阅读

于 2021-03-10T21:46:38.997 回答