You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 07:42:43