如何让nohup执行后自动释放命令行提示符?
远程重启Bun服务器脚本阻塞问题解决
问题描述
开发机为OSX,远程服务器是Ubuntu 22.04,使用Bun.js搭建Web服务器。以下重启脚本执行后,除非手动按下回车键,否则永远不会打印出done:
function remote() { ssh -l root -p $PORT $HOST "source ~/.bash_profile && $1" } echo " restarting server" remote "killall -r bun || true && nohup /apps/run_server.ts > /logs/server.txt 2>&1 < /dev/null &" echo " done"
远程服务器上的/apps/run_server.ts是带shebang的TypeScript文件:
#!/usr/bin/env bun import 'my_server' run_myserver()
问题原因
OSX的ssh客户端在执行包含后台进程的远程命令时,会持续监听本地标准输入,导致ssh会话无法立即终止,本地脚本因此阻塞在remote函数调用处,直到手动输入回车触发EOF。
解决方案
修改remote函数中的ssh命令,添加-n参数(将ssh的标准输入重定向到/dev/null),避免ssh监听本地输入:
function remote() { ssh -n -l root -p $PORT $HOST "source ~/.bash_profile && $1" } echo " restarting server" remote "killall -r bun || true && nohup /apps/run_server.ts > /logs/server.txt 2>&1 < /dev/null &" echo " done"
添加-n参数后,ssh会在远程命令执行完成后立即返回,本地脚本可以正常执行到echo "done",无需手动按回车。
内容的提问来源于stack exchange,提问作者Alex Craft
相关产品推荐
相关产品推荐

