我最近在 Linux 后台启动了 jboss,发现如果运行以下命令:
nohup ./startjboss.sh > server.log &
输出为:
[1] 18835
[root@cnt5-01b downloads]#
直接出现下一个命令的终端。
但是,如果我运行以下命令:
nohup ./startjboss.sh & > server.log
那么输出是:
[1] 19223
[root@cnt5-01b downloads]# nohup: appending output to `nohup.out'
然后,当我按下回车键时,它返回到:
[root@cnt5-01b downloads]#
这是我可以写入下一个命令的终端。
为什么行为会有差异(需要额外的 Enter 键)?这是一件非常小的事情,甚至不是什么问题;但我只是想知道。
答案1
当您放置 & 时,您是在告诉 shell 在后台运行它前面的内容并继续执行新命令。
当您将其放在行尾时,后面没有命令,因此 shell 将返回到交互模式。
当您将其放在中间时,shell 会将该行的其余部分解释为一个新命令。该命令将标准输出重定向到 server.log。由于您没有重定向 nohup 的输出,因此您现在可以在终端上看到它。由于 shell 之前已经重新绘制了它的 PS1,因此您会将该行输出视为命令,但它只是来自后台作业的输出。您甚至可以在之前不按 Enter 键的情况下键入新命令(尽管稍后阅读时可能不太清楚)。
答案2
嗯,基本上,当您运行带有该命令的命令时&
,您会失去一些功能。
以此为例,编写一个除了返回 2 之外不执行任何操作的脚本。
- 正常运行脚本,发出
echo $?
后您将看到输出2
。 - 运行脚本
&
,运行后echo $?
你会看到输出0
。
另外,在运行时nohup ./startjboss.sh & > server.log
,如果您检查server.log
文件,您会看到它是空的,这是因为您的后台进程的输出将0
成功终止,但是因为您没有将echo
其放入server.log
,所以实际上不会写入任何内容server.log
。