nohup 不会在 SSH 会话中显示下一个提示

nohup 不会在 SSH 会话中显示下一个提示

假设我通过 SSH 连接到远程 Ubuntu 系统。我想在那里执行一个脚本,以防nohup潜在的连接丢失并将其日志重定向到文件。我运行的命令是

nohup bash myscript.sh > log.txt &

然后,终端打印脚本的 PID 和消息:

nohup 忽略输入并将 stderr 重定向到 stdout

Ctrl光标冻结在那里,除非我使用+退出 SSH 会话D并重新登录,否则我无法执行其他命令。我希望 SSH 会话保持打开状态并继续执行下一个终端提示,而无需重新登录。有什么办法可以实现这一点吗?

答案1

如您所料,此命令在后台运行。然而,在这个特定的实例中,存在一个竞争条件,输出消息是在 shell 提示符之后小数部分写入的。

视觉结果是 shell 提示符位于nohup消息之前,或者消息被完全覆盖。

实际结果是,由于 shell 已写出提示符,因此已准备好执行下一个命令。您可以按 Enter 键生成新提示,或者直接键入下一个命令。

答案2

将其添加到 .bashrc

function detach { ( nohup $* </dev/null 2>&1 >/dev/null & disown ; sleep 0 ) >/dev/null ; } ; export -f detach

然后你可以运行: detach 例如 detach gedit .bashrc

您还可以为特定程序制作函数,例如:

function gedit { ( nohup gedit $* </dev/null 2>&1 >/dev/null & disown ; sleep 0 ) >/dev/null ; } ; export -f gedit

当程序在后台结束时,“disown”会阻止输出。

“sleep 0”导致提示符返回。

相关内容