很多时候,我们希望在Linux中运行的某些应用程序或者进程不会因为终端注销和断开而被终止。
nohup 命令
nohup
运行给定的命令时,忽略hangup信号,以便该命令可以在我们注销后继续在后台运行。
语法
# nohup COMMAND [ARG]...
如果标准输入是一个终端,则从“/DEV/NULL”重定向,这样终端会话不会错误地考虑命令所使用的终端。
如果标准输出是终端,则命令的标准输出将附加到文件nohup.out中;如果无法写入,则将其附加到文件“$HOME/nohup.out”;如果无法写入,则该命令不会运行。由“nohup”创建的任何“nohup.out”或者“$HOME/nohup.out”文件仅对用户可读写,而不考虑当前的umask设置。
如果标准错误是一个终端,它通常被重定向到与(可能重定向的)标准输出相同的文件描述符。但是,如果关闭了标准输出,则标准错误终端输出将附加到文件“nohup.out”或者“$HOME/nohup.out”中,如上所述。
例如:
在这种情况下,输出将添加到 ~/nohup.out 文件
# nohup less /var/log/messages nohup: ignoring input and appending output to `nohup.out'
注意:nohup不会自动将它运行的命令放在后台;您必须显式地执行此操作,方法是以“&”结束命令行。
您可以使用以下命令和重定向禁止此消息并限制命令生成或者保存任何输出到nohup.out
# nohup seq 1223434 > file.txt </dev/null &>/dev/null & [1] 3185 # OR # nohup seq 1234568 > file.txt 2>&1 & [1] 3184 # OR # nohup seq 1234568 > file.txt 2>/dev/null & [1] 3192
标准的输入输出和错误
一个程序有三个标准的输入和输出源。
程序通常打印到标准输出,有时打印到标准错误。
这三个文件描述符(我们可以将它们视为“数据管道”)通常称为 STDIN、STDOUT 和 STDERR。
有时他们没有被命名,而是被编号!它们的内置编号分别为 STDIN、STDOUT 和 STDERR 的 0、1 和 2.
disown命令
我们还可以使用此命令运行任何进程,而不会中断活动终端或者会话
如果在没有任何选项的情况下运行,则 disown 将从活动作业列表中删除 JobID。
现在让我们看看它如何在终端关闭或者注销后在后台运行任何进程。
在后台运行一个进程
# seq 1223434232 > file.txt & [1] 3879 # disown -h 3879 # top PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 3879 root 20 0 4084 564 512 R 99.0 0.1 0:23.00 seq
在此之后,我断开了我的完整会话并重新登录以验证我的进程是否仍在运行
# top PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 3879 root 20 0 4084 564 512 R 99.9 0.1 1:01.11 seq
是的,它仍然处于运行状态。
如果我们使用不带任何开关的 disown 命令,它将删除所有停止的作业。
例如
如果使用 (Ctrl + Z ) 停止的任何正在运行的进程可以通过使用看到
# jobs [1] Running seq 122354332 > file.txt & [2]- Running seq 17653434232 > file.txt & [3]+ Stopped seq 127564232 > file.txt
默认情况下不带任何参数运行 disown 命令,它将删除上次停止的进程,在我们的例子中是 (3)
# disown -bash: warning: deleting stopped job 3 with process group 3896
如果我们想删除特定停止的作业
# disown %3 -bash: warning: deleting stopped job 3 with process group 3904
删除所有停止的作业
# disown -a -bash: warning: deleting stopped job 1 with process group 3915 -bash: warning: deleting stopped job 2 with process group 3916 -bash: warning: deleting stopped job 3 with process group 3917 -bash: warning: deleting stopped job 4 with process group 3918