脚本在手动运行时完全运行,但在从另一个脚本运行时会丢失命令

Posted

技术标签:

【中文标题】脚本在手动运行时完全运行,但在从另一个脚本运行时会丢失命令【英文标题】:Script runs fully when ran manually but misses commands when ran from another script 【发布时间】:2016-09-02 12:12:34 【问题描述】:

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

第一个脚本是

#!/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 \015"
sleep 1
echo "Complete"

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

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

有什么想法吗?

【问题讨论】:

【参考方案1】:

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

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

stuff \015
echo "Complete"

使用正确的screenflags 也应该有效。

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

如需更现代的屏幕替代方案,请查看tmux。

【讨论】:

感谢您的信息,原来问题实际上是 Centos 6.7 本身,我们更新到 centos 7 并且脚本运行完美。我不确定发生了什么,但主要是它有效【参考方案2】:

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

【讨论】:

以上是关于脚本在手动运行时完全运行,但在从另一个脚本运行时会丢失命令的主要内容,如果未能解决你的问题,请参考以下文章

Bash 脚本手动运行,但在 crontab 上失败

Bash脚本手动运行,但在crontab上失败

GMail API:脚本在手动运行时有效,但在触发时无效

Ruby脚本在cron运行时抛出错误,但在用户运行时不会

AWS 无法通过 Cronjob 工作

Python RPi - 从另一个脚本运行脚本时找不到文件