Expect script does not work under crontab

泄露秘密 提交于 2019-11-29 06:45:57

问题


I have an expect script which I need to run every 3 mins on my management node to collect tx/rx values for each port attached to DCX Brocade SAN Switch using the command #portperfshow#

Each time I try to use crontab to execute the script every 3 mins, the script does not work!

My expect script starts with #!/usr/bin/expect -f and I am calling the script using the following syntax under cron:

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

However, when I execute the script (not under cron) it works as expected:

root# ./collect-all.exp sanswitchhostname

works just fine.

Please Please can someone help! Thanks.


The script collect-all.exp is:

#!/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

回答1:


I had the same issue, except that my script was ending with

interact

Finally I got it working by replacing it with these two lines:

expect eof
exit



回答2:


Changing interact to expect eof worked for me!

Needed to remove the exit part, because I had more statements in the bash script after the expect line (calling expect inside a bash script).




回答3:


There are two key differences between a program that is run normally from a shell and a program that is run from cron:

  1. Cron does not populate (many) environment variables. Notably absent are TERM, SHELL and HOME, but that's just a small proportion of the long list that will be not defined.
  2. Cron does not set up a current terminal, so /dev/tty doesn't resolve to anything. (Note, programs spawned by Expect will have a current terminal.)

With high probability, any difficulties will come from these, especially the first. To fix, you need to save all your environment variables in an interactive session and use these in your expect script to repopulate the environment. The easiest way is to use this little expect script:

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

That will write out a single very long line which you want to put near the top of your script (or at least before the first spawn). Then see if that works.




回答4:


Jobs run by cron are not considered login shells, and thus don't source your .bashrc, .bash_profile, etc.

If you want that behavior, you need to add it explicitly to the crontab entry like so:

$ crontab -l
0 13 * * * bash -c '. .bash_profile; etc ...'
$


来源:https://stackoverflow.com/questions/7494115/expect-script-does-not-work-under-crontab

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!