如何在不获取nohup.out的情况下使用nohup命令?


Answers:


612

nohup命令仅nohup.out在否则输出将输出到终端时才写入。如果您已将命令的输出重定向到其他位置(包括/dev/null-),那么它将在那里进行。

 nohup command >/dev/null 2>&1   # doesn't create nohup.out

如果您使用的是nohup,则可能意味着您想通过&在整个内容的末尾放置另一个命令来在后台运行命令:

 nohup command >/dev/null 2>&1 & # runs in background, still doesn't create nohup.out

在Linux上,运行带有的作业nohup也会自动关闭其输入。在其他系统(尤其是BSD和macOS)上并非如此,因此在后台运行时,您可能需要手动关闭输入。虽然关闭输入对是否创建of没有影响nohup.out,但它避免了另一个问题:如果后台进程尝试从标准输入中读取任何内容,它将暂停,等待您将其放回前台并键入内容。因此,超安全版本如下所示:

nohup command </dev/null >/dev/null 2>&1 & # completely detached from terminal 

但是请注意,这不会阻止命令直接访问终端,也不会从外壳的进程组中将其删除。如果要执行后者,并且正在运行bash,ksh或zsh,则可以通过不disown带任何参数的下一条命令来运行。这将意味着后台进程不再与外壳“作业”关联,并且不会从外壳转发任何信号给它。(请注意区别:disowned进程不会通过其父shell自动转发任何信号,但是如果没有nohup,它仍会接收HUP通过其他方式(例如手动kill命令)发送的信号nohup。ed进程会忽略所有HUP信号,无论如何发送。)

说明:

在Unixy系统中,每个输入源或输出目标都有一个与之关联的数字,称为“文件描述符”,简称“ fd”。每个正在运行的程序(“进程”)都有它们自己的一组,当一个新进程启动时,它已经打开了其中的三个:“ fd 0”的“标准输入”已打开,供进程读取。打开“标准输出”(fd 1)和“标准错误”(fd 2)进行写入。如果仅在终端窗口中运行命令,那么默认情况下,您键入的任何内容都会进入其标准输入,而其标准输出和标准错误都会发送到该窗口。

但是,您可以在启动命令之前要求Shell更改任何或所有这些文件描述符指向的位置;这就是重定向(<<<>>>)和管道(|)运营商做。

管道是其中最简单的管道。... command1 | command2的标准输出command1直接输入的标准输入command2。这是一个非常方便的安排,它导致了UNIX工具中的特殊设计模式(并解释了标准错误的存在,即使程序的输出进入管道中的下一个程序,该错误也允许程序向用户发送消息) 。但是您只能将标准输出通过管道传递给标准输入。您不能在不进行任何操作的情况下将任何其他文件描述符发送到管道。

重定向运算符更友好,因为它们使您可以指定要重定向的文件描述符。因此,0<infile从名为的文件中读取标准输入infile,而2>>logfile将标准错误附加到名为的文件末尾logfile。如果您未指定数字,则输入重定向默认为fd 0(<与相同0<),而输出重定向默认为fd 1(>与相同1>)。

另外,您可以将文件描述符组合在一起:2>&1表示“将标准错误发送到任何要输出的地方”。这意味着您将获得一个包含标准输出和标准误差的混合输出流,而不再需要将它们分开,但这也意味着您可以在管道中包含标准误差。

因此,该序列的>/dev/null 2>&1意思是“将标准输出发送到/dev/null”(这是一种特殊的设备,只会丢弃您写的任何内容)“,然后将标准错误发送到标准输出所要到达的任何地方”(我们确定是/dev/null)。基本上,“丢弃此命令写入任何文件描述符的任何内容”。

nohup检测到既没有标准错误也没有输出附加到终端时,它不会费心创建nohup.out,而是假设输出已经重定向到用户想要的位置。

/dev/null设备也可以输入。如果使用来运行命令</dev/null,那么该命令从标准输入中读取的任何尝试都会立即遇到文件结尾。注意,合并语法在这里不会产生相同的效果。它只能将文件描述符指向指向同一方向(输入或输出)的另一个文件描述符。Shell将允许您执行此操作>/dev/null <&1,但最终会创建一个在输出流上打开输入文件描述符的进程,因此,任何读取尝试都将触发致命的“无效文件描述符”错误,而不仅仅是点击文件结尾。


1
关于nohup“如果该进程稍后尝试从标准输入中读取任何内容,它将暂停,等待您将其放回前台并输入内容。” 似乎不正确。而是nohup 关闭标准输入(该程序即使在前台运行也将无法读取任何输入。它不会暂停,但会收到错误代码或EOF)。
蒂姆(Tim)

1
@Tim -这答案是正确的Linux,而不是BSD或OS X,上 nohup确实没有自动关闭标准输入。请注意,这nohup不是内置的Shell,而是二进制实用程序。
马克·里德

nohup是coreutils的一部分。您是说nohupLinux 的实现与BSD或OS X 的实现不同吗?
蒂姆(Tim)

是。名称“ coreutils”是指GNU软件包。但是BSD,OS X,SmartOS / Illumos和许多商业Unix(基本上,比GNU更长的时间)具有非GNU核心实用程序。awk不同,sed不同,nohup不同...
马克·里德

你为什么写“特别安全” </dev/null?另请参见0>/dev/null unix.stackexchange.com/a/266247
蒂姆

68
nohup some_command > /dev/null 2>&1&

这就是您需要做的!


4
还有另一个答案几乎具有相同的含义,但最后没有多余的“&”。
11101101b 2012年

10
&对将让你需要使用ctrl-c,如果事情给你。
SunSparc 2013年

1
在BG中运行的功能非常有帮助
ist_lion 2015年

仅当您不对捕获some_command输出(包括错误)感到困惑时,这才有用。
wulfgarpro

12

您是否尝试过重定向所有三个I / O流:

nohup ./yourprogram > foo.out 2> foo.err < /dev/null &

1
它不是>/ dev / null而不是</ dev / null吗?
Scott Chu

3
@ScottChu < /dev/null将重定向标准输入nohup。Linux不需要这样做,但是POSIX允许nohup将标准输入连接到终端而无法在后台运行的行为。这种系统的例子是BSD和OS X.
米克Rantalainen

8

您可能要使用分离程序。您可以像使用它一样使用它,nohup但是除非您告诉它,否则它不会产生输出日志。这是手册页:

NAME
       detach - run a command after detaching from the terminal

SYNOPSIS
       detach [options] [--] command [args]

       Forks  a  new process, detaches is from the terminal, and executes com‐
       mand with the specified arguments.

OPTIONS
       detach recognizes a couple of options, which are discussed below.   The
       special  option -- is used to signal that the rest of the arguments are
       the command and args to be passed to it.

       -e file
              Connect file to the standard error of the command.

       -f     Run in the foreground (do not fork).

       -i file
              Connect file to the standard input of the command.

       -o file
              Connect file to the standard output of the command.

       -p file
              Write the pid of the detached process to file.

EXAMPLE
       detach xterm

       Start an xterm that will not be closed when the current shell exits.

AUTHOR
       detach was written by Robbert Haarman.  See  http://inglorion.net/  for
       contact information.

注意我与该程序的作者没有任何从属关系。我只是该程序的满意用户。


2
链接没有中断,并且git repo很旧。它不包括当前的v0.2.3。
Dan D.

5

以下命令可让您在后台运行某些程序而无需获取nohup.out:

nohup command |tee &

这样,您将可以在远程服务器上运行脚本时获取控制台输出: 在此处输入图片说明


4
sudo bash -c "nohup /opt/viptel/viptel_bin/log.sh $* &> /dev/null"  &

重定向sudo的输出会导致sudo重新获得密码,因此需要笨拙的机制来执行此变体。


1

如果您前面的mac / linux上有一个BASH shell,请尝试以下步骤以实际了解重定向:

创建一个名为zz.sh的2行脚本

#!/bin/bash
echo "Hello. This is a proper command"
junk_errorcommand
  • echo命令的输出进入STDOUT文件流(文件描述符1)。
  • 错误命令的输出进入STDERR文件流(文件描述符2)

当前,只需执行脚本即可将STDOUT和STDERR都发送到屏幕。

./zz.sh

现在从标准重定向开始:

zz.sh > zfile.txt

在上面,“ echo”(STDOUT)进入zfile.txt。屏幕上显示“错误”(STDERR)。

以上与:

zz.sh 1> zfile.txt

现在,您可以尝试相反的方法,然后将“错误” STDERR重定向到文件中。来自“ echo”命令的STDOUT进入屏幕。

zz.sh 2> zfile.txt

结合以上两个,您将获得:

zz.sh 1> zfile.txt 2>&1

说明:

  • 首先,将STDOUT 1发送到zfile.txt
  • 然后,将STDERR 2本身发送到STDOUT 1(使用&1指针)。
  • 因此,1和2都放入同一个文件(zfile.txt)

最终,您可以将整个程序打包到 nohup命令中并在后台运行它:

nohup zz.sh 1> zfile.txt 2>&1&

1

您可以运行以下命令。

nohup <your command> & >  <outputfile> 2>&1 &

例如我在脚本中有一个nohup命令

./Runjob.sh > sparkConcuurent.out 2>&1
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.