我有一个在多个不同的远程 redhat 机器上运行的 web 服务。每当我想更新服务时,我都会从版本控制库(我使用 perforce)同步使用 perl 编写的新 Web 服务源代码,并使用新同步的 perl 代码重新启动服务。我觉得一个一个地登录到远程机器上然后手动执行那一系列命令来一个一个地重启服务太无聊了。所以我写了一个 bash 脚本 update.sh 如下所示,以便“一次在一个地方执行,更新所有机器”。我将在我的本地机器上运行这个 shell 脚本。但它似乎不起作用。它只执行第一个命令“sudo -u webservice_username -i”,我可以从本地机器的命令行中看出这一点。(下面的代码仅显示了它将如何更新远程 Web 服务之一。“
#!/bin/sh
ssh myname@remotehost1 'sudo -u webservice_username -i ; export P4USER=myname; cd dir ; p4 sync ; cd bin ; ./prog --domain=config_file restart ; tail -f ../logs/service.log'
为什么我知道唯一的第一个命令被执行?好吧,因为在我在本地机器上输入 ssh 的密码后,它显示:
Your environment has been modified. Please check /tmp/webservice.env.
它只是卡在那里。我的意思是没有回报。
根据评论员的建议,我为 ssh 添加了“-t”
#!/bin/sh
ssh -t myname@remotehost1 'sudo -u webservice_username -i ; export P4USER=myname; cd dir ; p4 sync ; cd bin ; ./prog --domain=config_file restart ; tail -f ../logs/service.log'
这将使本地命令行返回。但它看起来很奇怪,它不能 cd 到那个“dir”,它说“cd:dir: No such file or directory”它还说“p4: command not found”。所以看起来 sudo -u 命令执行没有效果,而 export 命令没有执行或执行没有效果。
详细的本地日志文件如下:
Your environment has been modified. Please check /tmp/dir/.env.
bash: line 0: cd: dir: No such file or directory
bash: p4: command not found
bash: line 0: cd: bin: No such file or directory
bash: ./prog: No such file or directory
tail: cannot open `../logs/service.log' for reading: No such file or directory
tail: no files remaining