Подтвердить что ты не робот

Ожидайте, что script не работает под crontab

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

Каждый раз, когда я пытаюсь использовать crontab для выполнения script каждые 3 минуты, script не работает!

Мой ожидание script начинается с #!/usr/bin/expect -f, и я вызываю script, используя следующий синтаксис в cron:

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

Однако, когда я выполняю script (не под cron), он работает как ожидалось:

root# ./collect-all.exp sanswitchhostname

отлично работает.

Пожалуйста, помогите кому-нибудь! Спасибо.


script 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 [email protected]$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
4b9b3361

Ответ 1

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

interact

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

expect eof
exit

Ответ 2

Смена interact до expect eof работала для меня!

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

Ответ 3

Существует два ключевых отличия между программой, которая обычно запускается из оболочки и программой, выполняемой из cron:

  • Cron не заполняет (многие) переменные среды. В частности, отсутствуют TERM, SHELL и HOME, но это лишь небольшая часть длинного списка, который не будет определен.
  • Cron не устанавливает текущий терминал, поэтому /dev/tty ничего не разрешает. (Обратите внимание, что программы, порожденные Expect, будут иметь текущий терминал.)

С большой вероятностью любые трудности придут от них, особенно в первую очередь. Чтобы исправить это, вам необходимо сохранить все переменные среды в интерактивном сеансе и использовать их в ожидании script для повторного заполнения среды. Самый простой способ - использовать этот маленький ожидаемый script:

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

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

Ответ 4

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

Если вам нужно это поведение, вам нужно явно добавить его в запись crontab следующим образом:

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