nohup 可以运行不受挂起影响的命令,并将输出输出到非 tty。 让我们在 bash 命令之后使用 nohup 运行一个简单的命令:
nohup ls -al &
我这里有两个问题:
1.处理10539
对于第一行输出,它是
[1] 10539
,表示有一个进程 10539。
我打开其他终端窗口来执行:
sudo lsof -i:10539
#nothing in the output
哪个命令导致进程号为 10539?
nohup ls -al &
或 ls -al &
或 ls -al
?
2.为什么
nohup: ignoring input and appending output to 'nohup.out'
作为终端中的新命令,而光标正在等待某些东西?
用很长的 bash 命令来测试:
debian@debian:~$ nohup sleep 100000 &
[1] 12021
debian@debian:~$ nohup: ignoring input and appending output to 'nohup.out'
并在新终端中执行:
sudo lsof -i:12021
#nothing for the command
1:您使用了错误的选项
lsof
。它的 -i
选项选择实际上是互联网端口的“文件”,而不是进程(并且 -i:10539
仅选择那些绑定到 TCP 或 UDP 端口号 10539 的文件)。您需要 -p
(进程 ID)选项:sudo lsof -p 10539
。检查man lsof
了解更多详情。
2:
nohup: ignoring input and appending output to 'nohup.out'
不是一个新命令,它只是输出到您期望命令输入的位置。它唯一等待的就是您输入另一个命令。
对于
nohup somecommand &
,&
会发生在 nohup
之前。也就是说,它在后台运行命令 nohup somecommand
,而不是 nohupping somecommand &
。
因此,您的 shell 在后台触发
nohup somecommand
,然后立即打印提示符 (debian@debian:~$
) 以指示您已准备好输入另一个命令。然后在那之后,后台的nohup
命令获取其方位,发现它需要重定向I/O,执行重定向,然后打印一条消息(nohup: ignoring input...
)表示它已完成重定向。
nohup
不知道这条消息会在 shell 提示符后打印(因此看起来像是一个命令),它只是将文本发送到终端,而终端只是像被告知的那样打印它。
此外,由于消息以换行符结尾,终端会将光标移动到下一行的开头,因此看起来您不再处于 shell 的命令提示符处。但这只是表面现象。就您的 shell 而言,它只是打印了提示符,并准备好让您输入新命令。尝试一下——只需输入一些普通命令并按回车键,它就会正常执行。
如果您希望屏幕看起来不那么混乱,请为命令添加短暂的延迟,例如
nohup ls -al & sleep 1
。这将使您的 shell 在打印提示符之前等待一秒钟,从而为 nohup
留出时间在不太混乱的地方打印其消息。