Ожидаемый скрипт не работает под crontab - PullRequest
13 голосов
/ 21 сентября 2011

У меня есть ожидаемый сценарий , который мне нужно запускать каждые 3 минуты на моем узле управления для сбора значений tx / rx для каждого порта, подключенного к коммутатору SAN DCX Brocade, с помощью команды #portperfshow#

Каждый раз, когда я пытаюсь использовать 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 ]

34 голосов
/ 13 сентября 2012

У меня была та же проблема, за исключением того, что мой сценарий заканчивался на

interact

Наконец-то я заработал, заменив его двумя строками:

expect eof
exit
4 голосов
/ 19 сентября 2012

Изменение interact на expect eof сработало для меня!

Необходим для удаления части exit, потому что у меня было больше операторов в скрипте bash после строки ожидания (вызов ожидаемого внутри скрипта bash).

3 голосов
/ 01 октября 2011

Существует два ключевых различия между программой, которая обычно запускается из оболочки, и программой, которая запускается из 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]]

Это выведет одну очень длинную строку, которую вы хотите поместить в верхнюю часть вашего скрипта (или, по крайней мере, перед первым spawn). Тогда посмотрите, работает ли это.

0 голосов
/ 08 апреля 2015

Задания, выполняемые cron, не считаются оболочками входа в систему, и, следовательно, не получают исходный код .bashrc, .bash_profile и т. Д.

Если вы хотите такое поведение, вам нужно явно добавить его в запись crontabвот так:

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