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

nohup命令有问题。

当我运行我的工作时,我有很多数据。 输出nohup.out变得太大,我的过程变慢。 我怎么能没有得到nohup.out运行这个命令?

如果输出到terminal,则nohup只写入nohup.out 。 如果你把命令的输出redirect到其他地方 – 包括/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运行作业也会自动closures其input。 在其他系统上,特别是BSD和OS X,情况并非如此,所以在后台运行时,可能需要手动closuresinput。 虽然closuresinput对nohup.out的创build没有影响,但它避免了另一个问题:如果后台进程试图从标准input中读取任何东西,它将暂停,等待你把它带回到前台并input一些东西。 所以这个非常安全的版本看起来像这样:

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

但是请注意,这不会阻止命令直接访问terminal,也不会将其从shell的进程组中删除。 如果你想做后者,你可以通过运行disown带参数的disown作为下一个命令,此时该进程不再与shell“作业”相关联,并且不会有任何信号(不仅仅是HUP )被转发从壳里取出来。

说明:

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

但是在启动命令之前,你可以让shell改变这些文件描述符指向的地方, 这是redirect( <<<> ,)和pipe道( | )操作符所做的。

pipe道是最简单的… command1 | command2 command1 | command2安排command1的标准输出直接送入command2的标准input。 这是一个非常方便的安排,导致了UNIX工具中的特定devise模式(并解释了标准错误的存在,它允许程序向用户发送消息,即使其输出正在进入下一个程序中) 。 但是只能将标准输出传送到标准input; 你不能发送任何其他文件描述符没有一些杂耍。

redirect操作符更友好,因为它们让您指定要redirect的文件描述符。 所以0<infile从名为infile的文件读取标准input,而2>>logfile将标准错误附加到名为logfile的文件的末尾。 如果不指定数字,则inputredirect默认为fd 0( <0< )相同,而输出redirect默认为fd 1( >1>相同)。

另外,您可以将文件描述符组合在一起: 2>&1表示“标准输出正在发送时发送标准错误”。 这意味着您将得到一个单一的输出stream,其中包括标准输出和标准错误,无法再将其分开,但这也意味着您可以在pipe道中包含标准错误。

因此,序列>/dev/null 2>&1意思是“将标准输出发送到/dev/null ”(这是一个特殊的设备,只是抛出你写的任何东西),然后发送标准错误到任何标准输出“(我们确信它是/dev/null )。 基本上,“扔掉这个命令写入任何一个文件描述符”。

nohup检测到它的标准错误和输出都没有附加到terminal时,它不会创buildnohup.out ,但是假设输出已经被redirect到了用户想要的地方。

/dev/null设备也适用于input。 如果使用</dev/null运行命令,那么该命令从标准input读取的任何尝试都将立即遇到文件结束。 请注意合并语法在这里不会有相同的效果。 它只能用于将文件描述符指向另一个在相同方向(input或输出)打开的描述符。 shell可以让你做>/dev/null <&1 ,但是最终会在输出stream上打开一个input文件描述符来创build一个进程,所以不仅仅是打到文件结束,任何读取尝试都会触发一个致命的“无效的文件描述符”错误。

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

这就是你需要做的!

你有尝试redirect所有三个I / Ostream:

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

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

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

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

redirectsudo的输出导致sudo重新input密码,因此需要一个尴尬的机制来做这个变种。

你可以在nohup下面执行&> 2>&1&eg例如我在脚本里没有hup命令./Runjob.sh> sparkConcuurent.out 2>&1