我正在编写一个脚本,将项目部署到多台服务器(9 台,并且还在增加)。由于压缩、复制和远程连接,脚本的速度很快变得相当慢。所以现在我正在研究让脚本触发通过屏幕运行的帮助程序。伪代码中的理想工作流程如下:
deployment script
accept user input for deployment parameters
echo "deployment initiated"
TTY=`tty`
start helper 1 in detached screen, dumped to a temp file
exit
helper 1
export from SVN
compress files
upload to temporary directory on live servers
swap old and new web directories on live servers
* start helper 2 in $TTY
exit
helper 2
echo "deployment done"
echo "do you want to view deployment log? [y/N]"
take user input
if yes
output temp file
delete temp file
exit
除了标有 * 的命令外,其他一切都很简单。我可以将静态消息传送到write $TTY
,但要获取用户输入,我需要在要显示该消息的终端外部执行 shell 脚本。有什么办法吗?
(顺便说一句,我在开发服务器上运行Centos。)
答案1
您可以使用以下命令启动连接到 TTY 的助手 2:
helper2.sh >$TTY 2>&1 <$TTY
将标准输入,标准输出和标准误差重定向到TTY。
不幸的是,这种方法存在问题:
一旦“部署脚本”退出,shell 将从 TTY 读取输入以获取用户的下一个命令。当 shell 和 helper2.sh 都尝试从 TTY 读取时,用户输入的位置是不可预测的。
如果用户在启动“部署脚本”后启动编辑器或其他命令,则助手 2 的输出将会污染其屏幕上的内容。
一些替代方法:
- 完成帮助程序脚本的部署脚本
wait
,以防止 shell 与帮助程序 2 竞争用户输入 - 让助手 2 直接通过电子邮件将日志发送给开发人员,而无需询问他们是否想查看