1 votes

l'écran d'attente script ne fonctionne plus lorsqu'il est exécuté par cron

J'espère que cette question convient à ce forum.

J'ai un appareil, un modem. Je parle à ce modem avec le programme linux "screen" en tant que programme terminal. Je l'invoque comme ceci : " /usr/bin/screen /dev/tty6 ". J'ai besoin d'envoyer environ 6 commandes par session. J'utilise un expect script afin de pouvoir automatiser le processus. L'expect script spawns le processus screen, envoie les commandes puis sort.

Ce système fonctionne parfaitement lorsque je l'exécute à partir d'une session de terminal ou lorsque je l'exécute à distance en utilisant ssh depuis une autre machine. Mais lorsque j'utilise cron pour l'exécuter, il échoue. Sur la machine locale, il échoue avec une erreur du type : spawn id exp6 not open while executing exp_send . Il le fait au troisième envoi dans l'attente script.

J'ai essayé d'utiliser cron pour exécuter à distance en utilisant ssh avec le -t , -tt , -ttt mais je reçois l'erreur : " Pseudo-terminal will not be allocated because stdin is not a terminal. "

Mes crontabs ont une variable path définie, néanmoins la plupart des commandes sont invoquées avec un chemin complet, j'en suis presque sûr.

J'ai essayé de faire apparaître l'écran avec un -m mais il n'y a toujours pas de spawn. Le fait de faire apparaître l'écran et de le détacher n'a aucun sens dans ce scénario. Une partie du problème semble être que l'exécution de screen en tant qu'émulateur de terminal sur un port série est différente de son exécution normale. Nous vous remercions de votre aide et de vos commentaires.

L'attente script ici :

---do-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

--------the cron tab

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

L'email 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""

0 votes

Pouvez-vous montrer l'entrée cron et l'attente script ?

0 votes

J'ai généré le script avec autoexpect mais j'ai ajouté beaucoup de choses en tcl pour gérer les arguments donc il est assez gros et il est appelé par plusieurs script à tour de rôle. Je vais essayer de couper quelques fragments. Je pense que je dois le faire de toute façon pour m'assurer que rien d'autre ne cause ce problème.

0 votes

Et voilà. @glenn-jackman.

1voto

k-h Points 139

On dirait que je dois juste ajouter :

TERM=vt100

à mon cronfile. Ouch.

Tout fonctionne maintenant.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X