当前位置: 首页 > 知识库问答 >
问题:

如何使用nohup命令而不获取nohup.out?

滕成双
2023-03-14

我对nohup命令有意见。

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

共有1个答案

孔寒
2023-03-14

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 

但是,请注意,这不会阻止命令直接访问终端,也不会将它从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的文件中读取标准输入,而 2>logfile将标准错误追加到名为 logfile的文件末尾。如果未指定数字,则输入重定向默认值为FD0( <0<);输出重定向默认值为FD1( >1>)。

此外,您还可以将文件描述符组合在一起:2>&1表示“在标准输出要去的地方发送标准错误”。这意味着您得到了一个包含标准输出和标准错误的输出流,再也无法将它们分开,但这也意味着您可以在管道中包含标准错误。

因此,序列>/dev/null2>&1表示“将标准输出发送到/dev/null”(这是一种特殊的设备,可以丢弃您向其写入的任何内容)“然后将标准错误发送到标准输出要去的地方”(我们刚刚确定了这是/dev/null)。基本上,“扔掉这个命令写到任何一个文件描述符的东西”。

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

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

 类似资料:
  • 问题内容: 在Python中,通过而不是打扰其输出来调用命令的最短和标准方法是什么。 我尝试了,但是似乎返回了输出。我对此并不感到烦恼,我只需要在不使输出混乱的情况下静默运行程序即可。 如果有帮助,我正在打电话给我,我的意图只是打电话给我。 问题答案: p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

  • 我已经安装了使用: 当我尝试使用命令时,例如: 我得到了zsh错误: 未找到命令:rasa错误 我在Mac OS Catalina上,使用: Python version Python3 version pip version 我的变量如下所示:

  • 问题内容: 我在网站上启用了CSRF保护,但是CSRF令牌唯一一次放置在隐藏字段中的时间是何时使用。我正在通过ajax发布数据,并且也需要发送CSRF以防止出现500个错误。 我以为有一种方法可以将CSRF令牌显式地嵌入到页面中,但是我似乎找不到它。 如果页面上没有表单,如何获得CSRF令牌? 问题答案: 您可以通过安全性类获取CSRF令牌名称和值:

  • 问题内容: 我想做的是从而不是从Volley库中使用一些数据。 以下是用于从服务器中获取JSON对象的代码。 我试图改变到后改为。但这并没有解决。 问题答案: 中的url 不是可选的,并且JSONObject参数用于将带有请求的参数发布到url。 从文档中:http : //afzaln.com/volley/com/android/volley/toolbox/JsonObjectRequest

  • 我正在从事一个需要oauth2令牌才能进行通信的项目。后端给了我一个curl命令,但我不知道如何在Unity中将其转换为WWW格式,因为我以前没有使用http或json文件的经验。你能帮我取一下代币吗?谢谢下面是curl代码的样子: $curl-v-u{CLIENT_ID}:{CLIENT_SECRET}”https://api.domo.com/oauth/token?grant_type=cl

  • 问题内容: 当我将子命令与python argparse一起使用时,可以获得所选的参数。 因此不包含。由于可能存在全局arg,因此简单地编写不起作用。如何获得子命令本身? 问题答案: 关于argparse子命令的Python文档的最底层介绍了如何执行此操作: 您也可以使用我发现的示例上方引用的方法。