期望脚本在crontab下不起作用

时间:2011-09-21 03:01:16

标签: automation cron crontab expect

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

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

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

3 * * * * /usr/bin/expect -f /root/portsperfDCX1/collect-all.exp sanswitchhostname 

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

root# ./collect-all.exp sanswitchhostname

工作正常。

请有人帮忙!感谢。


脚本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

4 个答案:

答案 0 :(得分:34)

除了我的脚本以

结尾外,我遇到了同样的问题
interact

最后,我用它来代替这两行:

expect eof
exit

答案 1 :(得分:4)

interact更改为expect eof对我有用!

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

答案 2 :(得分:3)

通常从shell运行的程序与从cron运行的程序之间存在两个主要区别:

  1. Cron不会填充(许多)环境变量。特别缺席的是TERM,SHELL和HOME,但这只是未列出的长名单中的一小部分。
  2. Cron没有设置当前终端,因此/ dev / tty无法解析任何问题。 (注意,Expect 产生的程序将具有当前终端。)
  3. 很有可能出现任何困难,尤其是第一次。要修复,您需要在交互式会话中保存所有环境变量,并在期望脚本中使用这些变量来重新填充环境。最简单的方法是使用这个小小的期望脚本:

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

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

答案 3 :(得分:0)

cron运行的作业不被视为登录shell,因此不会提供.bashrc,.bash_profile等。

如果您想要这种行为,则需要将其显式添加到crontab条目中,如下所示:

$ crontab -l
0 13 * * * bash -c '. .bash_profile; etc ...'
$
相关问题