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

Ofe*_*fer 278 unix jobs

我有nohup命令的问题.

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

Mar*_*eed 556

nohup.out如果输出不是终端,nohup只会写入.如果你将命令的输出重定向到其他地方 - 包括/dev/null- 那就是它的位置.

 nohup command >/dev/null 2>&1   # doesn't create nohup.out
Run Code Online (Sandbox Code Playgroud)

如果您正在使用nohup,这可能意味着您希望在后台运行命令,将另一个命令放在&整个事件的最后:

 nohup command >/dev/null 2>&1 & # runs in background, still doesn't create nohup.out
Run Code Online (Sandbox Code Playgroud)

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

nohup command </dev/null >/dev/null 2>&1 & # completely detached from terminal 
Run Code Online (Sandbox Code Playgroud)

但请注意,这不会阻止命令直接访问终端,也不会将其从shell的进程组中删除.如果要执行后者,并且运行bash,ksh或zsh,则可以通过disown不带参数作为下一个命令运行来执行此操作.这意味着后台进程不再与shell"作业"相关联,也不会从shell转发任何信号.(注意区别: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,但最终创建一个输出文件描述符在输出流上打开的进程,因此任何读取尝试都会触发致命的"无效文件描述符"错误,而不是仅仅命中文件结尾.

  • 你能解释一下2和1吗? (4认同)
  • @ user1271772 - 我添加了详细的解释; 希望能帮助到你. (3认同)
  • 为什么有些答案给出&gt; / dev / null而有些给出&lt;/ dev / null? (2认同)
  • @Tim - 该答案对于 Linux 是正确的,但对于 BSD 或 OS X 则不正确,在这些操作系统上,`nohup` 不会*不会*自​​动关闭标准输入。请注意,`nohup` 不是内置的 shell,而是一个二进制实用程序。 (2认同)
  • 是的。名称“coreutils”指的是 GNU 包。但是 BSD、OS X、SmartOS/Illumos 和许多商业 Unix(基本上是那些比 GNU 存在时间更久的 Unix)都具有非 GNU 核心实用程序。`awk` 不同,`sed` 不同,`nohup` 不同...... (2认同)
  • 这是最好的。3 种方式中的每一种都可以完美地满足每个人的需求。谢谢 (2认同)

111*_*01b 64

nohup some_command > /dev/null 2>&1&
Run Code Online (Sandbox Code Playgroud)

这就是你需要做的!

  • 如果这对您很重要,那么`&`将使您无需使用`ctrl-c`. (9认同)
  • 还有另一个答案几乎有同样的事情,但他们最终没有额外的"&". (4认同)
  • 在BG中运行的能力非常有帮助 (2认同)
  • `nohup some_command&&gt; / dev / null&`更短。 (2认同)

Azi*_*ikh 11

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

nohup ./yourprogram > foo.out 2> foo.err < /dev/null &
Run Code Online (Sandbox Code Playgroud)

  • @ScottChu` </ dev/null`重定向`nohup`的标准输入.Linux不需要这个,但是如果标准输入连接到终端,POSIX允许"nohup"无法在后台运行的行为.这种系统的例子是BSD和OS X. (3认同)
  • 不应该是 **`&gt;`** /dev/null 而不是 &lt; /dev/null 吗? (2认同)

Dan*_* D. 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.
Run Code Online (Sandbox Code Playgroud)

注意我与该程序的作者没有任何关系.我只是该计划的满意用户.

  • 链接没有被破坏,git repo已经过时了.它不包括当前的v0.2.3. (2认同)

Kje*_*rup 5

sudo bash -c "nohup /opt/viptel/viptel_bin/log.sh $* &> /dev/null"  &
Run Code Online (Sandbox Code Playgroud)

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


Clo*_*ish 5

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

nohup command |tee &
Run Code Online (Sandbox Code Playgroud)

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


Thy*_*yag 5

如果您的 mac/linux 上有 BASH shell,您可以尝试以下步骤来实际了解重定向:

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

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

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

./zz.sh
Run Code Online (Sandbox Code Playgroud)

现在从标准重定向开始:

zz.sh > zfile.txt
Run Code Online (Sandbox Code Playgroud)

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

上面的内容与:

zz.sh 1> zfile.txt
Run Code Online (Sandbox Code Playgroud)

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

zz.sh 2> zfile.txt
Run Code Online (Sandbox Code Playgroud)

结合以上两者,可以得到:

zz.sh 1> zfile.txt 2>&1
Run Code Online (Sandbox Code Playgroud)

解释:

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

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

nohup zz.sh 1> zfile.txt 2>&1&
Run Code Online (Sandbox Code Playgroud)