linux - 带有 sudo 的 bash 远程命令不起作用

标签 linux bash shell

我已经在这里回答了这个问题 bash - running remote script from local machine关于如何在涉及 sudo 的情况下使用远程命令。我认为它在工作,因为我收到消息说我的服务器已成功重启等,所以我选择了答案。但是今天看到服务器居然不是重启,而是莫名其妙被kill了。

我第一次运行此命令时所做的事情:

ssh user@host.com -t 'sudo /etc/init.d/script restart' #or -t just after ssh, same thing

我收到这条消息:

Restarting openerp-server: Stopping openerp-server: openerp-server.
Starting openerp-server: openerp-server.
Connection to host.com closed.

是的,然后我觉得一切都很好。但实际上要查看进程是否重新启动,我发现它不起作用。

当我再次尝试重新启动时(使用相同的命令),我收到了这条消息:

Restarting openerp-server: Stopping openerp-server: start-stop-daemon: warning: failed to kill 25205: No such process
openerp-server.
Starting openerp-server: openerp-server.
Connection to host.com closed.

但是如果我在直接连接到远程服务器时使用相同的命令,一切正常并且我的脚本会正常重启服务器。 相同的命令我的意思是:

ssh user@host.com
sudo /etc/init.d/script restart

那么这里到底发生了什么?

最佳答案

似乎启动它的脚本正在做一些顽皮的事情,它依赖于 TTY 在命令返回后短暂地保持事件状态。可能是立即退出造成了麻烦。如果它启动一个附加到 TTY 内的 shell 的后台作业,并在不久之后分离,那么关闭连接可能会终止 shell 并终止其中的作业。这可以解释为什么当你重新启动时,脚本认为有一个服务的进程号,但后来找不到它:也许进程号被记录在某处,但随后进程在它开始之前就被杀死了。

要确认,您可以尝试一些操作。远程登录,运行 sudo 命令,然后立即退出:

ssh user@host.com
sudo /etc/init.d/script restart; exit

看看这个立即退出是否也遇到同样的问题。

也试试

ssh user@host.com -t 'sudo /etc/init.d/script restart; sleep 30'

强制它稍等片刻,看看是否能带你到任何地方。

关于linux - 带有 sudo 的 bash 远程命令不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25681863/

相关文章:

Linux - 从 gmail 中继读取电子邮件并运行脚本

linux - 将 tar.gz 重新打包为 tar 并排除一些文件

linux - Bash : Adding thread-capability to this bash function, 所以它更快

android - 关于在 Android 应用程序中加载图像

c++ - MinGW DLL 项目与 Linux 的兼容性

linux - bash 文件的符号链接(symbolic link)

bash - 在 Ubuntu 中将 mahout 添加到路径

linux - 错误 Shell 脚本

linux - ping "-n"标志如何工作?并且它会影响响应时间吗? (Linux)

c - 使用 fork() 在子进程中未获取适当的父 ID