如何使用nohup命令而不返回noup .out?

我用nohup命令有问题。

当我运行我的工作时,我有很多数据。输出nohup。Out变得太大,我的进程变慢了。我如何运行这个命令而不得到noup .out?

467494 次浏览

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

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

你试过重定向所有三个I/O流吗:

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

nohup命令只在输出到终端时写入nohup.out。如果你已经将命令的输出重定向到其他地方——包括/dev/null——它就会转到那里。

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

注意,>/dev/null 2>&1序列在大多数(但不是所有)shell中可以缩写为>&/dev/null

如果你正在使用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

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

解释:

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

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

管子是其中最简单的……command1 | command2command1的标准输出直接送入command2的标准输入。这是一种非常方便的安排,在UNIX工具中形成了一种特定的设计模式(并解释了标准错误的存在,该错误允许程序向用户发送消息,即使其输出将进入管道中的下一个程序)。但你只能将标准输出管道到标准输入;如果不进行一些操作,就不能将任何其他文件描述符发送到管道。

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

同样,你也可以将文件描述符组合在一起:2>&1表示“无论标准输出在哪里,都发送标准错误”。这意味着您将得到一个包含标准输出和标准错误的单一输出流,并且无法再将它们分开,但这也意味着您可以在管道中包含标准错误。

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

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

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

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

这就是你所需要做的!

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

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

您可以执行如下命令。

nohup <your command> & >  <outputfile> 2>&1 &
< p >。 我有一个nohup命令在脚本

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

下面的命令可以让你在后台运行一些东西,而不会得到noup .out:

nohup command |tee &
通过这种方式,你将能够在远程服务器上运行脚本时获得控制台输出: enter image description here < / p >

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

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

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

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

./zz.sh

现在从标准重定向开始:

zz.sh > zfile.txt

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

以上同:

zz.sh 1> zfile.txt

现在您可以尝试相反的方法,将“error”STDERR重定向到文件中。来自“echo”命令的STDOUT显示在屏幕上。

zz.sh 2> zfile.txt

将上述两者结合起来,你会得到:

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

解释:

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

最终,你可以把整个东西打包到Nohup命令&中,在后台运行:

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