如何防止在终端中启动的应用程序意外退出?


10

我使用以下命令从终端启动应用程序:

/Applications/Mail.app/Contents/MacOS/Mail &

重要的是  &

  • 对于Unix / Linux / Solaris:

    • 我在学校了解到,添加make  &可以使该程序独立运行。
    • 我强烈记得xeyes &即使关闭外壳后也要启动类似的命令  并使程序安全运行。
  • 在Mac OS X(内部为Unix)上:

    1. 我使用启动应用程序,  &然后关闭“终端”窗口:应用程序退出!
    2. 为什么在Mac OS X上会发生这种不良行为?
    3. 如何解决?

Answers:


7

完成您要完成的工作(在OS X以及Linux,FreeBSD或其他系统上)的“标准”方法是使用以下命令nohup

nohup program &

这将开始program,由于&-,它将相对于shell在后台运行,并且由于nohup命令而将忽略挂断信号。

这样,即使您关闭外壳程序也将继续运行程序。是因为要关闭Terminal.app而要关闭外壳,还是因为要断开与计算机的ssh连接或类似连接而断开外壳,都没有关系。


1
这将nohup.out在当前文件夹中创建一个文件。即使没有什么可写的。几周后,nohup.out我的Mac中到处都有文件。:-(
Nicolas Barbulesco 2014年

1
@NicolasBarbulesco使用nohup command>/dev/null&command&disown
Lri 2014年


6

使用与号“ &”,您将告诉Terminal在外壳本身的后台运行该进程。因此,当您关闭外壳程序(并终止进程)时,GUI(Mail.app本身)也将关闭。

从终端启动Mail的正确命令很简单:

open -a Mail; exit

编辑:我刚刚在U&L Stack Exchange上发现了这一点:&符号在shell脚本行的末尾是什么意思?提供的答案非常好,可以比我更详尽,更准确地解释正在发生的事情!我强烈建议您仔细阅读。


如何将命令行参数传递给应用程序呢?像这样:/Users/nicolas/Desktop/Firefox-29-fr/Firefox.app/Contents/MacOS/firefox -profile "/Users/nicolas/Desktop/Firefox-29-fr/Profil-Firefox-29-fr/" -no-remote &
Nicolas Barbulesco 2014年

2
@NicolasBarbulesco这是一个单独的问题-请参阅手册页以获取打开信息,我在这里认为一个问题
user151019 2014年

如何启动一个特定的应用程序(不在in中/Applications,而是在特定路径下)?像这样:/Users/nicolas/Desktop/Firefox-29-fr/Firefox.app/Contents/MacOS/firefox -profile "/Users/nicolas/Desktop/Firefox-29-fr/Profil-Firefox-29-fr/" -no-remote &
Nicolas Barbulesco 2014年

@NicolasBarbulesco打开[完整路径]或cd到目录并打开[文件]。您可以将〜/用作主文件夹,并使用特殊字符“星号”,这是较短的表示法,假设没有其他字符串与值IE匹配:〜/ De * / Fire * ...等等。或者只是编写一个简单的脚本:cat> nameofscript .....#!/ bin / sh ....打开[完整路径] .... ^ D ..... chmod + x nameofscript .....。\ nameofscript ....和可选的mv nameofscript $ PATH / yourpersonalbin。推荐读书人开放。这是一个简单的命令,但作为一个简单的命令,折衷并不是那么强大。
njboot 2014年

1
抱歉,仍然需要使用-a参数:open -a Applications/Mail.app/Contents/MacOS/Mail; exit
njboot 2014年

4

我找到了解决方案:

(/Applications/Mail.app/Contents/MacOS/Mail &)

它很简单,很漂亮,而且有效!

括号( )在子shell 中  启动命令。


-并且&无需等待就从程序返回到外壳程序,因此您可以继续使用外壳程序或终止外壳程序,而无需开始退出程序。
r_alex_hall

3

@jksoegaard具有正确的命令,但是正如您在注释中提到的那样,它会创建一个nohup.out文件。要停止创建nohup.out文件,您需要将STDOUT和STDERR重定向到其他位置。完整的命令将是nohup program &>/dev/null &。这将在后台运行程序,忽略SIGHUP,并将所有STDOUT和STDERR发送到/ dev / null。

但是,如果您不记得要添加nohup(就像您在原始问题中一样),则可以使用disown -arh命令将所有后台运行的作业标记为忽略SIGHUP。


好的答案,但仍然很复杂。和漂亮的个人资料图片。:-)
Nicolas Barbulesco 2014年

0

或者你可以尝试 open -a /Applications/Mail.app

用法:打开[-e] [-t] [-f] [-W] [-R] [-n] [-g] [-h] [-s] [-b] [-a] [文件名] [--args参数]
帮助:打开可从外壳打开文件。
      默认情况下,使用该文件的默认应用程序打开每个文件。
      如果文件采用URL形式,则文件将作为URL打开。
选项:
      -a用指定的应用程序打开。
      -b使用指定的应用程序捆绑包标识符打开。
      -e使用TextEdit打开。
      -t使用默认文本编辑器打开。
      -f从标准输入中读取输入,并使用TextEdit打开。
      -F --fresh新鲜启动应用程序,即不还原Windows。保存的永久状态将丢失,不包括未命名文档。
      -R,--reveal在查找器中选择而不是打开。
      -W,--wait-apps阻止直到已使用的应用程序关闭(即使它们已经在运行)。
          --args所有其余参数在argv中传递给应用程序的main()函数,而不是打开。
      -n,--new即使该应用程序已经在运行,也要打开它的新实例。
      -j,--hide启动隐藏的应用程序。
      -g,--background不将应用程序置于前台。
      -h,--header在头文件位置中搜索与给定文件名匹配的头,然后将其打开。
      -s对于-h,使用的SDK;如果提供,则仅搜索名称包含自变量值的SDK。
                        否则,将使用每个平台中版本最高的SDK。

-2

我找到了解决方案:用邪恶与邪恶作战。

我使用以下命令启动应用程序:

/Applications/Mail.app/Contents/MacOS/Mail & exit

外壳立即退出。即使关闭了“终端”窗口,该应用程序仍然可以生存。

但是这种解决方案不是很方便。


1
您确实应该打开与open捆绑在一起的应用程序。随着捆绑内容的变化以及规范,这就是未来的证明。
伊恩·C

@Ian —在这里,我对打开特定路径/Applications而不是Mac并没有与Mac捆绑在一起的应用程序特别感兴趣。
Nicolas Barbulesco 2014年

1
.app文件夹称为“捆绑包”,open无论它们位于该/Applications文件夹还是任何其他文件夹中,该命令都可以启动它们。在此上下文中,“捆绑”一词并不意味着“与OS X一起发货”。
没人

打开与单击图标相同。与OP要求的从命令行启动应用程序不同。
泰德·比格姆
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.