ожидайте, что экран выполнения сценария прекращает работать, когда выполнено кроном

Я надеюсь, что этот вопрос хорошо для этого форума.

У меня есть устройство, модем. Я говорю с этим модемом с программой Linux "экран" как терминальная программа. Я вызываю его как это"/usr/bin/screen /dev/tty6". Я должен отправить приблизительно 6 команд на сессию или около этого. Я использую ожидать сценарий, таким образом, я могу автоматизировать процесс. Ожидать сценарий порождает экранный процесс, отправляет, команды затем выходит.

Эта система хорошо работает, когда я выполняю ее от терминального сеанса или когда я выполняю ее удаленно использующий ssh от другой машины. Но когда я использую крон для выполнения его, это перестало работать. На локальной машине это перестало работать с ошибкой как: spawn id exp6 not open while executing exp_send. Это делает это на третьем представляет ожидать сценарий.

Я пытался использовать крон для выполнения удаленно использования ssh с -t, -tt, -ttt опции, но я получаю ошибку:"Pseudo-terminal will not be allocated because stdin is not a terminal."

Мои crontabs имеют набор переменной пути, тем не менее, большинство команд вызывается с полным путем, я вполне уверен.

Я пытался породить экран с a -m опция, но этому все еще не удается, по-видимому, метать икру. Экран Spawning и отсоединение его не имеют никакого смысла в этом сценарии. Часть проблемы, кажется, что, выполняя экран, поскольку эмулятор терминала к последовательному порту отличается от выполнения ее обычно. Любая справка или понимание значительно ценились бы.

Ожидать сценарий здесь:

---сделайте - 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

--------вкладка крона

/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"

Электронная почта крона

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
задан 23 July 2015 в 05:32
1 ответ

Похоже, мне просто нужно добавить:

TERM=vt100

в свой cron-файл. Ой.

Все работает.

1
ответ дан 4 December 2019 в 00:03

Теги

Похожие вопросы