Cron 到 Bash 脚本到 Bash 脚本到 Expect 脚本

Cron 到 Bash 脚本到 Bash 脚本到 Expect 脚本

我想执行一系列 Expect 脚本。执行链是这样的:Cron 作业启动一个 bash 脚本,这个包装器启动大约 11 个 bash 脚本Parallel- 每个脚本都调用一个Expect脚本。

一切都很好,直到那Expect部分。我在第二个 Bash 脚本中的并行部分将每个期望脚本的主机名吐出到一个文件中。事实上,它们确实成组出现,但 Expect 脚本立即终止。

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

48 9 * * * rm /home/admin/.flag && /home/admin/.profile; /home/admin/nodeTest.sh

nodeTest的重要代码是:

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 启动 Expect 脚本 - oneNode 只是将主机名转换为 IP 并确定要运行哪个脚本。

这在命令行下工作得很好;只是 Cron 的工作让我感到悲伤。我读到interacttcl 命令会导致问题,但我不在我的脚本中使用它。这是并行运行的线路:

timeout 80 sudo expect /home/admin/assets/activeTest $sag $ip &

更新:将上一行更改为:

timeout 80 sudo /usr/bin/expect /home/admin/assets/activeTest $sag $ip &

更新:检查 Expect 脚本的错误后,我遇到的是缺少导入的环境变量。第一个错误发生是因为TERM变量 == 未知:

'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 时,我可以看到术语已设置:

TEMR=vt100

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

答案1

这是错误的

48 9 * * * rm /home/admin/.flag && /home/admin/.profile; /home/admin/nodeTest.sh

最关键的是,你将 .profile 作为命令执行-- 在一个中执行它单独的过程当该进程退出时,所有环境修改都会随之消失。

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

我建议你想要source.profile。使用rm -f这样,即使文件丢失也不会发生错误。并且仅在 .profile 中没有错误的情况下才执行脚本。

48 9 * * * rm -f /home/admin/.flag; . /home/admin/.profile && /home/admin/nodeTest.sh
# ..................................^
# source the .profile: execute it in the _current_ shell

下一个,不解析ls。改变

            for chunk in `ls /home/admin/assets/sagLogs/x*`; do
                    cat $chunk | ...

            for chunk in /home/admin/assets/sagLogs/x*; do
                    cat "$chunk" | ...

相关内容