期望脚本在crontab下不起作用

Red*_*our 14 cron automation crontab expect

我有一个期望脚本,我需要在管理节点上每隔3分钟运行一次,以便使用命令收集连接到DCX Brocade SAN Switch的每个端口的tx/rx值#portperfshow#

每次我尝试使用crontab每3分钟执行一次脚本时,脚本不起作用!

我的期望脚本开头,#!/usr/bin/expect -f 我在cron下使用以下语法调用脚本:

3 * * * * /usr/bin/expect -f /root/portsperfDCX1/collect-all.exp sanswitchhostname 
Run Code Online (Sandbox Code Playgroud)

但是,当我执行脚本(不在cron下)时,它按预期工作:

root# ./collect-all.exp sanswitchhostname
Run Code Online (Sandbox Code Playgroud)

工作得很好.

请有人帮忙!谢谢.


脚本collect-all.exp是:

#!/usr/bin/expect -f

#Time and Date
set day [timestamp -format %d%m%y]
set time [timestamp -format %H%M]

#logging
set LogDir1 "/FPerf/PortsLogs"
et timeout 5
set ipaddr [lrange $argv 0 0]
set passw "XXXXXXX"


if { $ipaddr == "" } {
        puts "Usage: <script.exp> <ip address>\n"
        exit 1
}


spawn ssh admin@$ipaddr
expect -re "password"
send "$passw\r"

expect -re "admin"

                log_file "$LogDir1/$day-portsperfshow-$time"
                send "portperfshow -tx -rx -t 10\r"
                expect timeout "\n"
                send \003
                log_file

                send -- "exit\r"
                close
Run Code Online (Sandbox Code Playgroud)

小智 36

我有同样的问题,除了我的脚本以

interact
Run Code Online (Sandbox Code Playgroud)

最后,我通过用以下两行代替它来实现它:

expect eof
exit
Run Code Online (Sandbox Code Playgroud)

  • 非常感谢你!我必须使用"set timeout 600"显式设置超时,因为默认超时10s对于我正在进行的操作来说太快了. (2认同)

小智 5

更改interactexpect eof 我的工作!

需要删除该exit部分,因为在期望行之后,我在bash脚本中有更多的语句(在bash脚本中调用Expect)。


Don*_*ows 4

从 shell 正常运行的程序和从 cron 运行的程序之间有两个主要区别:

  1. Cron 不会填充(许多)环境变量。值得注意的是 TERM、SHELL 和 HOME 都没有出现,但这只是未定义的长列表中的一小部分。
  2. Cron 不会设置当前终端,因此 /dev/tty 不会解析任何内容。(注意,由 Expect 生成的程序有一个当前终端。)

任何困难很有可能都来自于这些,尤其是第一个。要修复此问题,您需要在交互式会话中保存所有环境变量,并在您的期望脚本中使用这些变量来重新填充环境。最简单的方法是使用这个小期待脚本:

unset -nocomplain ::env(SSH_AUTH_SOCK)   ;# This one is session-bound anyway
puts [list array set ::env [array get ::env]]
Run Code Online (Sandbox Code Playgroud)

这将写出一条非常长的行,您希望将其放在脚本顶部附近(或至少在第一行之前spawn)。然后看看是否有效。