我想执行一系列 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 的工作让我感到悲伤。我读到interact
tcl 命令会导致问题,但我不在我的脚本中使用它。这是并行运行的线路:
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" | ...