我的nohup命令有问题。

当我工作时,我有很多数据。输出nohup.out变得太大,我的进程变慢了。如何在不获取nohup.out的情况下运行此命令?

评论

unix.stackexchange.com/q/23010/2644的副本

#1 楼

如果输出将否则输出到终端,则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上,情况并非如此,因此,在后台运行时,您可能需要手动关闭输入。尽管关闭输入对nohup.out的创建或不起作用没有影响,但它避免了另一个问题:如果后台进程尝试从标准输入中读取任何内容,它将暂停,等待您将其放回前台并键入内容。因此,额外的安全版本如下所示:

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


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

解释:

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

但是您可以询问在启动命令之前更改任何或所有这些文件描述符指向何处的外壳;这就是重定向(<<<>>>)和管道(|)运算符的作用。

管道是其中最简单的... 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运行命令,那么该命令从标准输入中读取的任何尝试都会立即遇到文件结尾。注意,合并语法在这里不会产生相同的效果。它只能将一个文件描述符指向指向同一方向(输入或输出)的另一个文件描述符。该外壳程序可以让您执行>/dev/null <&1,但这最终会创建一个在输出流上打开输入文件描述符的进程,因此,任何读取尝试都将触发致命的“无效文件描述符”错误,而不是仅敲打文件尾。

评论


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

– Tim
16-3-1在4:27



@Tim-该答案对于Linux是正确的,但对于BSD或OS X则不正确,因为nohup不会自动关闭标准输入。请注意,nohup不是内置的shell,而是二进制实用程序。

–马克·里德(Mark Reed)
16 Mar 1 '16 at 4:52



nohup是coreutils的一部分。您是说nohup的实现对于linux和BSD或OS X是不同的吗?

– Tim
16 Mar 1 '16 at 5:01

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

–马克·里德(Mark Reed)
16 Mar 1 '16 at 5:15

这是最好的。可以根据自己的需要完美解释三种3种方法。谢谢

–袋鼠
17年7月15日在0:53

#2 楼

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


这就是您需要做的一切!

评论


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

– 11101101b
2012年5月22日19:03

如果对您很重要,则&上的&将使您无需使用ctrl-c。

– SunSparc
13年5月29日在19:53

在BG中运行的功能非常有帮助

–ist_lion
15年7月15日在0:57

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

– wulfgarpro
17年5月10日在1:07



#3 楼

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

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


评论


它不是> / dev / null而不是
–朱伟
16-11-24在1:18



@ScottChu
– Mikko Rantalainen
18年1月25日在17:59

#4 楼

您可能要使用分离程序。您可以像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.


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

评论


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

– Dan D.
2014年3月20日在18:37

#5 楼

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

nohup command |tee &


这样,您将能够在运行脚本的同时获得控制台输出。远程服务器:


#6 楼

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


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

#7 楼

如果您的Mac / Linux前面有一个BASH Shell,请尝试以下步骤以实际了解重定向:

创建一个2行脚本zz.sh

#!/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&


#8 楼

您可以运行以下命令。

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


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

./Runjob.sh > sparkConcuurent.out 2>&1