无法正确拒绝 AppImage

问题描述

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

我写了一个小脚本,我用“popup-shell”调用它,它使用 fzf 来选择一个文件。我将此文件传递给 marktext appimage 并否认该进程,之后“popup-shell”关闭。不幸的是,在 shell 关闭时,marktext 应用程序也会关闭

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

进程树-ish:

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

任何指针将不胜感激。

解决方法

你可以使用

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

Some further reading

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...