我编写了一个 Ruby 脚本来管理我的 LyX 文档。该脚本与用户(=我)进行简短的 CLI 交互,然后决定要打开的文件的名称,并通过lyx
shell 命令打开它。
现在的问题是,我需要一个用于 CLI 交互的终端,但是当我关闭终端时,LyX 会弹出一个消息框,上面写着“SIGHUP 信号已捕获!再见”。当我点击 时OK
,它会关闭 LyX。
当我通过 Ruby 的命令启动 shell exec
(关闭 ruby 进程并为给定的 shell 命令启动一个新进程)时,出现了这个问题。当我尝试用叉子替换它时,LyX 窗口从未打开 - 我猜测 LyX 在SIGHUP
Ruby 脚本完成且终端关闭时收到了 - 当我gets
在 Ruby 脚本末尾添加命令时,我证实了这一猜测以防止它关闭 - 然后 LyX 窗口被打开,但是当我按下Enter
完成 ruby 脚本时,LyX 收到SIGHUP
并关闭。
现在,我可能可以通过用 GUI 替换 CLI 交互并放弃终端窗口来解决这个问题,但使用 GUI 来完成类似的事情对我来说似乎有点过分了。那么,有没有办法在我关闭终端时阻止 LyX 关闭呢?
我正在使用 KDE 运行 OpenSUSE 12.1 64 位,终端模拟器是 Konsole。
答案1
一种选择是使用 nohup 运行它:
nohup mycoollittlescript
另一种方法是在终端模拟器(如 tmux 或 screen)内运行它。这些终端应用程序本身就是终端模拟器。当父终端关闭时,它们仍然在后台运行,您可以从另一个终端窗口重新连接到它们。尝试这个:
screen -R -d NameOfMyBackgroundJob
第一次这将创建一个新会话。重复使用上述命令将连接到现有会话并断开其与任何其他终端窗口的连接。