我正在使用以下命令从本地机器重新启动服务器:
ssh -l root -p 22 $SERVER_HOST "cd $SERVER_DIR && nohup bin/restart &"
它不起作用,并且不打印任何内容,所以我不知道问题是什么。但如果我删除
nohup
和 &
- 它就可以工作了。为什么以及如何让它工作(并在终止 ssh 后在后台继续)?
不带 nohup 的版本可以工作,但会阻止 shell(与带 nohup 的版本不同,它还打印
bin/restart
脚本的输出)。但我无法使用它,因为我需要服务器继续在后台工作。
ssh -l root -p $SERVER_PORT $SERVER_HOST "cd $SERVER_DIR && bin/restart"
如果有关系的话,
bin/restart
脚本的内容(重新启动Ruby on Rails应用程序)
. /root/.asdf/asdf.sh
killall -r ruby
RAILS_ENV=production bundle exec rails server
对我有用的是:
ssh -tt -l root -p 22 $SERVER_HOST 'cd $SERVER_DIR && nohup bin/restart & sleep 1'
使用 OpenSSH 7.2p2(客户端和服务器)、bash 4.3、Linux 4.15 进行测试。
-tt
强制 ssh 分配终端,这对于 nohup
的工作显然很重要。
sleep 1
并不特别,您只需要一些能够强制 shell 进行上下文切换的东西,它也可以是 /bin/true
,但这并不是万无一失的。
您还可以检查: KillUserProcesses 的系统守护进程登录配置(退出时) 这会覆盖 nohup, disown a.s.o
# See logind.conf(5) for details.
[Login]
#NAutoVTs=6
#ReserveVT=6
KillUserProcesses=no