我想执行一系列Expect脚本。执行链如下: Cron作业启动bash脚本,这个包装器在Parallel中启动~11个bash脚本--每个脚本都调用一个Expect脚本。
在Expect部分之前一切都很好。我在第二个Bash脚本中有一个并行部分,将每个expect脚本的主机名吐到一个文件中。do实际上以组形式出现,但Expect脚本会立即消失。
我听说,由于Cron作业的性质,我需要将环境变量传递给作业。到目前为止我已经尝试过:
48 9 * * * rm /home/admin/.flag && /home/admin/.profile; /home/admin/nodeTest.shnodeTest的重要代码是:
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命令会引发问题,但我没有在脚本中使用它。这是并行运行的行:
timeout 80 sudo expect /home/admin/assets/activeTest $sag $ip &更新:将前一行更改为:
timeout 80 sudo /usr/bin/expect /home/admin/assets/activeTest $sag $ip &Update:在检查了Expect脚本中的错误之后,我遇到的是缺少导入的env变量。第一个错误发生是因为 TERM variable是==未知的:
'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所以它是在包装器中设置的,但是它不会被expect脚本继承。该怎么办呢?
发布于 2019-07-15 14:54:22
这是不对的
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" | ...https://unix.stackexchange.com/questions/530252
复制相似问题