首页 > 解决方案 > 为什么我的命令不适用于 nohup 和 SSH?

问题描述

我正在使用以下命令从本地机器重新启动服务器:

ssh -l root -p 22 $SERVER_HOST "cd $SERVER_DIR && nohup bin/restart &"

而且它不起作用,并且什么也没打印,所以我不知道是什么问题。但是,如果我删除nohup并且&- 它正在工作。为什么,以及如何使其工作(并在终止 ssh 后继续在后台运行)?

没有 nohup 的版本可以工作,但会阻止 shell(它还打印bin/restart脚本的输出,这与带有 nohup 的版本不同)。但我不能使用它,因为我需要服务器继续在后台工作。

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

标签: bashshellunixsshnohup

解决方案


对我有用的是:

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,但这不是万无一失的。


推荐阅读