les*_*ana 684 shell job-control nohup disown
之间有什么区别
$ nohup foo
Run Code Online (Sandbox Code Playgroud)
和
$ foo &
Run Code Online (Sandbox Code Playgroud)
和
$ foo &
$ disown
Run Code Online (Sandbox Code Playgroud)
cel*_*chk 704
让我们首先看看如果程序从没有&(也没有任何重定向)的交互式 shell(连接到终端)启动会发生什么。所以让我们假设你刚刚输入foo:
foo已创建。SIGHUP,它也会向SIGHUP进程发送一个(这通常会导致进程终止)。现在,让我们看看如果将进程置于后台会发生什么,即键入foo &:
foo已创建。jobs并可以使用%n(其中n是作业编号)访问。fg,在这种情况下,它会继续,就好像您不会使用&它一样(如果由于尝试从标准输入读取而停止,它现在可以继续从终端读取)。SIGHUP,它也会向SIGHUP进程发送 a 。根据外壳程序和可能为外壳程序设置的选项,在终止外壳程序时,它还会向SIGHUP进程发送 a 。现在disown从外壳的作业列表中删除作业,因此上面的所有子点不再适用(包括SIGHUP外壳发送的进程)。但是请注意,它仍然连接到终端,所以如果终端被破坏(如果它是一个 pty,可能会发生这种情况,比如由xterm或创建的ssh,并且控制程序通过关闭 xterm 或终止SSH连接而终止) , 程序将在尝试从标准输入读取或写入标准输出时失败。
什么nohup呢,在另一方面,是有效地处理从所述终端分开:
EOF)。nohup.out,因此如果终端失败,程序不会失败写入标准输出,因此进程写入的任何内容都不会丢失。SIGHUP(因此名称)。请注意,nohup这不会从 shell 的作业控制中删除该进程,也不会将其置于后台(但由于前台nohup作业或多或少无用,您通常会使用 将其置于后台&)。例如,与 with 不同disown,shell 仍会告诉您 nohup 作业何时完成(当然,除非 shell 之前终止)。
所以总结一下:
& 将作业置于后台,即阻止它尝试读取输入,并使 shell 不等待其完成。disown从 shell 的作业控制中删除进程,但它仍然保持连接到终端。结果之一是外壳不会向它发送SIGHUP. 显然,它只能应用于后台作业,因为在前台作业运行时您无法输入它。nohup从端子断开过程,它的输出重定向到nohup.out和从屏蔽它SIGHUP。效果之一(命名效果)是该进程不会收到任何发送的SIGHUP. 它完全独立于作业控制,原则上也可用于前台作业(尽管这不是很有用)。Mic*_*zek 181
使用&会导致程序在后台运行,因此您将获得一个新的 shell 提示,而不是在程序结束之前阻塞。nohup并且disown基本上不相关;它们抑制 SIGHUP(挂断)信号,因此当控制终端关闭时程序不会自动终止。nohup在工作开始时执行此操作。如果您nohup在开始时没有工作,您可以使用disown修改正在运行的工作;没有参数它会修改当前的工作,这是刚刚背景的工作
Mar*_* An 19
这是我尝试在后台运行 soffice 的经验,遵循非终止命令(例如tail)。对于这个例子,我将使用sleep 100.
在下面的所有情况下,我都是这样执行的:
./scriptfile
<Ctl-C>
Run Code Online (Sandbox Code Playgroud)
#!/bin/bash
/opt/libreoffice4.4/program/soffice -invisible -nofirststartwizard &
sleep 100
Run Code Online (Sandbox Code Playgroud)
我看到soffice日志/按Ctrl- Csoffice 停止
#!/bin/bash
nohup /opt/libreoffice4.4/program/soffice -invisible -nofirststartwizard &
sleep 100
Run Code Online (Sandbox Code Playgroud)
我没有看到soffice日志/按Ctrl- Csoffice 停止
#!/bin/bash
/opt/libreoffice4.4/program/soffice -invisible -nofirststartwizard & disown
sleep 100
Run Code Online (Sandbox Code Playgroud)
我看到soffice日志/按Ctrl- Csoffice 停止
#!/bin/bash
setsid /opt/libreoffice4.4/program/soffice -invisible -nofirststartwizard &
sleep 100
Run Code Online (Sandbox Code Playgroud)
我看到soffice日志/按Ctrl- Csoffice不停止
为了节省空间:
nohup setsid ..:不显示日志/ soffice不会停止对Ctrl-C
nohup用& disown底:不显示登录/ soffice在停止Ctrl-C
iva*_*kov 18
简短回答:
&,这样您就可以运行下一个命令而无需等待它完成nohup如果您希望命令忽略信号,则使用SIGHUP,因此当您关闭终端或从 ssh 会话注销时,进程会继续运行disown如果您忘记运行命令并且nohup想要注销而不终止进程(它将否认后台的所有进程),请使用。将进程置于后台并否认它:
bg将停止的进程置于后台disown使进程忽略终端终止