手动运行时脚本会完全运行,但从另一个脚本运行时会错过命令



我有两个脚本正在测试,以自动启动服务器上的服务,但它们的行为很奇怪。

第一个脚本是

#!/bin/sh
screen -dmS Test_Screen
sleep 1
sudo sh cd.sh
echo "finished"

它完美地运行,但它运行的脚本没有,如下

#!/bin/sh
screen -S Test_Screen -X stuff "cd /home/Test"
sleep 1
screen -S Test_Screen -X eval "stuff 15"
sleep 1
echo "Complete"

如果我从命令行运行第二个脚本,它将完美地运行,并将CD放入屏幕内的目录中。但是,如果它从第一个脚本运行,它将不会光盘进入屏幕内的正确目录,但仍将打印"完成"。

我正在使用CENTOS 6.7和GNU屏幕的最新版本

有什么想法吗?

这似乎是会话嵌套的问题。在第一个脚本中,您创建了一个名为Test_Screen的会话。在第二个脚本中,-S参数告诉屏幕创建一个同名的会话。这可能会导致屏幕退出,而cd无法进入正确的目录。

您可以将cd命令移到sudo sh cd.sh前面,并从第二个脚本中删除那些screen调用,只留下

stuff 15
echo "Complete"

使用正确的screen标志也应该有效。

#!/bin/sh
screen -dr Test_Screen -X stuff "cd /home/Test"
sleep 1
screen -dr Test_Screen -X eval "stuff 15"
sleep 1
echo "Complete"

要获得更现代的屏幕替代方案,请查看tmux。

好吧,结果真的很奇怪。发帖后,我在centos 6.7 hyper V测试环境中尝试了几件事,得到了完全相同的问题。然而,当天晚些时候,我们最终更换了服务提供商,并在此过程中升级到centos 7。我不知道为什么,但由于更新,脚本现在运行得很好,我实际上能够将两个脚本合并为一个,以提高效率。如果有人知道更新修复的原因,请随时告诉我。

最新更新