【问题标题】:Why my command is not working with nohup and SSH?为什么我的命令不适用于 nohup 和 SSH?
【发布时间】:2021-03-11 02:10:18
【问题描述】:

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

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

【问题讨论】:

  • 不要以这种方式启动或重新启动服务。您的操作系统使用 systemd 吗?然后将它们设置为 systemd 服务,systemctl restart your-service 将重新启动它(如果您希望命令在进程成功重新启动之前返回,请使用 --no-block 选项)。如果你的目标操作系统是 MacOS,那么它的进程管理器 launchd 由 launchctl 控制。
  • 所以如果你使用exec </dev/null >some.log 2>&1; myprogram & disown -h $!,恭喜你,你只是手动完成了nohup myprogram &所做的一切。
  • 回到这里的问题:首先要阅读你的nohup.outedit的内容。
  • 你为什么不能ssh -l root -p $SERVER_PORT $SERVER_HOST "cd $SERVER_DIR && bin/restart" &
  • bin/restart 替换为sleep 120 并检查结果。

标签: bash shell unix ssh nohup


【解决方案1】:

对我有用的是:

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,但这并不那么确定。

【讨论】:

    猜你喜欢
    • 2013-07-09
    • 1970-01-01
    • 2016-12-07
    • 2012-08-11
    • 1970-01-01
    • 1970-01-01
    • 2020-10-01
    • 1970-01-01
    • 2022-08-23
    相关资源
    最近更新 更多