bash - 为什么我的命令不适用于 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
解决方案
对我有用的是:
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
,但这不是万无一失的。
推荐阅读
- ruby-on-rails - RailsAdmin 验证外键崩溃
- angular6 - Ag Grid:当用户删除一个行组时,我如何知道哪个行组被删除?
- selenium-ide - 如何在 Selenium IDE (Chrome) 中自动增加一个数字
- less - .Less 基于父背景颜色动态改变文本颜色
- javascript - 提交时将 HTML 添加到联系表格 7 电子邮件
- java - Microsoft Graph API Java SDK:获取站点及其服务器相对 url
- regex - sed 多条件正则表达式匹配
- .net-core - Amazon DynamoDBv2 QueryOperationConfig SelectValues.Count 不起作用
- php - 我想回显每次重复的总数
- reactjs - 功能组件随着 useMemo / React.memo 消失