假设我通过 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”导致提示符返回。