首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从Cron到Bash脚本到Bash脚本期望脚本

从Cron到Bash脚本到Bash脚本期望脚本
EN

Unix & Linux用户
提问于 2019-07-15 13:58:34
回答 1查看 577关注 0票数 1

我想执行一系列Expect脚本。执行链如下: Cron作业启动bash脚本,这个包装器在Parallel中启动~11个bash脚本--每个脚本都调用一个Expect脚本。

Expect部分之前一切都很好。我在第二个Bash脚本中有一个并行部分,将每个expect脚本的主机名吐到一个文件中。do实际上以组形式出现,但Expect脚本会立即消失。

我听说,由于Cron作业的性质,我需要将环境变量传递给作业。到目前为止我已经尝试过:

代码语言:javascript
复制
48 9 * * * rm /home/admin/.flag && /home/admin/.profile; /home/admin/nodeTest.sh

nodeTest的重要代码是:

代码语言:javascript
复制
for i in {1..10}; do
                for chunk in `ls /home/admin/assets/sagLogs/x*`; do
                        cat $chunk | parallel -j 11 -I% --max-args 1 /home/abdmin/oneNode.sh "%"
                        clear
                done
        done

这些块有11个主机名长。它们被放入并行程序中,通过oneNode - oneNode启动Expect脚本,只需将主机名转换为IP并确定要运行哪个脚本。

这在命令行中运行得很好;只是让我感到悲伤的Cron工作。我读到过interact tcl命令会引发问题,但我没有在脚本中使用它。这是并行运行的行:

代码语言:javascript
复制
timeout 80 sudo expect /home/admin/assets/activeTest $sag $ip &

更新:将前一行更改为:

代码语言:javascript
复制
timeout 80 sudo /usr/bin/expect /home/admin/assets/activeTest $sag $ip &

Update:在检查了Expect脚本中的错误之后,我遇到的是缺少导入的env变量。第一个错误发生是因为 TERM variable是==未知的:

代码语言:javascript
复制
'unknown': I need something more specific.
    while executing
"exec /usr/bin/clear"
    invoked from within
"puts [exec /usr/bin/clear]"
    (file "/home/admin/assets/activeTest" line 35)

当我从调用脚本(oneNode)转储env时,可以看到设置了术语:

代码语言:javascript
复制
TEMR=vt100

所以它是在包装器中设置的,但是它不会被expect脚本继承。该怎么办呢?

EN

回答 1

Unix & Linux用户

发布于 2019-07-15 14:54:22

这是不对的

代码语言:javascript
复制
48 9 * * * rm /home/admin/.flag && /home/admin/.profile; /home/admin/nodeTest.sh

最关键的是,您以命令的形式执行.profile --它在一个单独的进程中执行它,当该进程退出时,所有的环境修改都随之消失。

另外,如果.flag不存在,会发生什么?您将不处理配置文件,但仍然运行nodeTest脚本。

我建议你要source .profile。使用rm -f,以便在文件丢失时不会发生错误。并且只有在.profile中没有错误时才执行脚本。

代码语言:javascript
复制
48 9 * * * rm -f /home/admin/.flag; . /home/admin/.profile && /home/admin/nodeTest.sh
# ..................................^
# source the .profile: execute it in the _current_ shell

下一个,不解析ls。变化

代码语言:javascript
复制
            for chunk in `ls /home/admin/assets/sagLogs/x*`; do
                    cat $chunk | ...

代码语言:javascript
复制
            for chunk in /home/admin/assets/sagLogs/x*; do
                    cat "$chunk" | ...
票数 3
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/530252

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档