Ожидать запуска скрипта при запуске cron
Я надеюсь, что этот вопрос в порядке для этого форума.
У меня есть устройство, модем. Я говорю с этим модемом с программой linux "screen" в качестве терминальной программы. Я призываю это так/usr/bin/screen /dev/tty6
Msgstr "Мне нужно отправлять около 6 команд за сессию или около того. Я использую сценарий ожидаемого события, чтобы я мог автоматизировать процесс. Ожидаемый сценарий порождает процесс экрана, отправляет команды и завершает работу.
Эта система работает нормально, когда я запускаю ее из терминальной сессии или когда я запускаю ее удаленно, используя ssh с другой машины. Но когда я использую cron для запуска, это не удается. На локальной машине происходит сбой с ошибкой вроде: spawn id exp6 not open while executing exp_send
, Это происходит при третьей передаче в ожидаемом скрипте.
Я пытался использовать Cron для удаленного запуска с помощью ssh
с -t
, -tt
, -ttt
варианты, но я получаю ошибку: "Pseudo-terminal will not be allocated because stdin is not a terminal.
"
У моих crontabs есть переменная пути, тем не менее большинство команд вызываются с полным путем, я уверен.
Я пробовал порождать экран с -m
вариант, но он по-прежнему не может появиться. Создание и отключение экрана не имеет смысла в этом сценарии. Частично проблема заключается в том, что запуск экрана в качестве эмулятора терминала для последовательного порта отличается от его нормальной работы. Любая помощь или понимание будет принята с благодарностью.
Ожидаемый скрипт здесь:
--- сделай stuff.exp
#!/usr/bin/expect -b
set verbose 0
set verb [lindex $argv 0]
if { $verb eq "-v" } {
set ::argv [lassign $::argv verbose]
set verbose 1
}
set phone [lindex $argv 0]
set message [lindex $argv 1]
if { $verbose == 1 } {
send_user "phone = ($phone)\n"
send_user "message = ($message)\n"
}
set force_conservative 1 ;# set to 1 to force conservative mode even if
if {$force_conservative} {
set send_slow {1 .1}
proc send {ignore arg} {
sleep .1
exp_send -s -- $arg
}
}
# turn off screen echo
if { $verbose == 0 } {
log_user 0
}
set timeout -1
spawn /usr/bin/screen /dev/tty6 cs8
match_max 100000
# wait 100 milliseconds
after 100
send -- "+++"
after 100
send -- "ATZ\r"
expect -exact "OK\r
"
send -- "AT+CMGF=1\r"
expect -exact "OK\r
"
send -- "AT+CMGS=\"$phone\"\r"
expect -exact "
> "
send -- "$message\r"
expect -exact "\r
> "
send -- "^Z"
expect -exact "OK\r
"
send -- "^Ak"
after 500
send -- "y"
#expect eof
exit 0
-------- вкладка cron
/etc/cron.d/local-test
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# m h dom mon dow user command
*/3 * * * 1-5 fred /home/fred/do-stuff.exp -- -v 12345678 "test message cron 2"
Электронная почта cron
phone = (123456789)
message = (test message cron 2)
spawn /usr/bin/screen /dev/tty6 cs8
Please set a terminal type.
+++ATZ
send: spawn id exp6 not open
while executing
"exp_send -s -- $arg"
(procedure "send" line 3)
invoked from within
"send -- "AT+CMGF=1\r""
1 ответ
Похоже, я просто должен добавить:
TERM=vt100
на мой cronfile. Уч.
Все работает сейчас.