目前,我正在使用nohup command &
它在后台发送它。但问题是:如果我执行,nohup command &
我会得到如下结果:
root@ubuntu:/home/test# nohup sleep 10 &
[2] 52439
root@ubuntu:/home/test# nohup: ignoring input and appending output to `nohup.out'
<I need to press ENTER key here to take back my shell control.>
root@ubuntu:/home/test#
我需要做什么 :
root@ubuntu:/home/test# nohup sleep 10 &
[2] 52439
root@ubuntu:/home/test# nohup: ignoring input and appending output to `nohup.out'
root@ubuntu:/home/test#
我不想在之后按“ENTER KEY” nohup sleep 10 &
。
因为我正在处理自动化部分,所以我需要在一个命令发送到后台后,无需按任何键即可执行下一个命令。例如:
root@ubuntu:/home/test# nohup start-server.py &
root@ubuntu:/home/test# nohup start-client.py &
[start-server.py
需要在后台运行。]但问题是,start-server.py执行后,它不会执行下一个命令。我需要按“ENTER 键”才能执行下一个命令。
有解决办法吗?任何帮助都将不胜感激。
答案1
nohup sleep 10 2>/dev/null &
该nohup
命令将消息打印到 stderr,并将2>/dev/null
stderr 发送到/dev/null
。
答案2
无需输入回车。只需输入下一个命令,它就会起作用(您看到的只是 shell 提示输出后的一些输出)。这与在 shell 提示符下输入回车时发生的情况完全相同:您会得到另一个提示符。:-)
答案3
您实际上不需要按 Enter。尽管 nohup 的标准错误似乎在您的命令行上,但您可以“覆盖”它,并且只有您输入的内容才会作为下一个命令输入。
答案4
从https://stackoverflow.com/a/10408906/738947
nohup.out
nohup 仅在输出结果与终端不同时才写入。如果您将命令的输出重定向到其他地方(包括/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 和 OS X)上并非如此,因此在后台运行时,您可能需要手动关闭其输入。虽然关闭输入对 的创建与否没有影响nohup.out
,但它避免了另一个问题:如果后台进程尝试从标准输入读取任何内容,它将暂停,等待您将其带回前台并输入一些内容。因此,超安全版本如下所示:
nohup command </dev/null >/dev/null 2>&1 & # completely detached from terminal
但请注意,这不会阻止命令直接访问终端,也不会将其从 shell 的进程组中移除。如果你想要执行后者,可以通过disown
在下一个命令中不带参数运行来实现,此时进程不再与 shell“作业”相关联,并且不会具有任何HUP
从 shell 转发给它的信号(不仅仅是)。
解释:
在 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
,但这最终会创建一个在输出流上打开输入文件描述符的进程,因此,任何读取尝试都会触发致命的“无效文件描述符”错误,而不仅仅是遇到文件结尾。