为什么有些应用程序可以通过终端自动分离,而有些则不会?

为什么有些应用程序可以通过终端自动分离,而有些则不会?

我注意到了一件非常有趣的事情,例如:

  • 我用Atom 编辑器然后我通过我的终端调用它:

    $ atom
    

    然后按下Enter,这将触发编辑器并使终端光标指向新行;使其(终端)可以自由地用于进一步的命令行实用程序。

  • 然而,在使用时节奏盒使用rhythmbox终端命令,它倾向于在前台工作(我猜)并保持终端占用,直到我关闭节奏盒或者使用CTRL+ C

我也尝试过这个texmaker,它执行的操作类似节奏盒。我知道这&将在背景中完成该过程,但是对于这里提到的一些应用程序是否有合理的解释?

有没有什么技巧或窍门可以让我学会如何调整这样的东西?

笔记

我尝试在上述应用程序上使用CTRL+ ,然后应用程序Z灰显然后变得没有反应,我不得不强制他们退出

环境

  • 使用Ubuntu 16.10

  • Gnome 终端

  • echo $SHELL/bin/bash

答案1

正如评论中指出的那样,这种行为对于每个应用程序都是特定的。例如,用 C 编程语言编写的应用程序可以使用setsid调用断开与控制终端的连接,尽管它们需要调用fork() 首先系统调用。Python 也有os.setsid()os.fork()函数;尽管可以简单地os.fork()使用创建子进程并终止父进程

软件作者使用的另一种非常常见的技术是通过包装脚本启动应用程序,并通过调用新进程nohup。这正是这样atom做的:

$ file $(which atom)
/usr/bin/atom: Bourne-Again shell script, ASCII text executable
$ grep 'nohup' $(which atom)                                                            
    nohup "$ATOM_PATH" --executed-from="$(pwd)" --pid=$$ "$@" > "$ATOM_HOME/nohup.out" 2>&1
      cat "$ATOM_HOME/nohup.out"

你也可以这样做。例如,我倾向于通过一个函数来启动程序并将其与终端分离,该函数会启动nohup已附加到命令中的所需程序:

runstuff() {
    nohup "$@" >/dev/null 2>&1 & 
} 

一旦你在你的中定义了它.bashrc,你就可以像这样启动 Firefox:

runstuff firefox

另一种方法是通过setsid命令(其名称与 C 系统调用相同,但实际上是一个独立的二进制文件):

setsid firefox

答案2

如果您使用带有 X 环境的 Ubuntu,您可以按 Ctrl + F2,然后输入所需的命令(即rythmbox)。它不会有单独的终端供您按 ctrl+C。

您也可以尝试运行nohup rythmbox &。它应该在后台运行您的播放器并使其具有终端关闭保护功能。

相关内容