fragen stichworte

Es wird erwartet, dass der Skript-Bildschirm nicht mehr läuft, wenn er von cron ausgeführt wird

Ich hoffe, dass diese Frage für dieses Forum in Ordnung ist.

Ich habe ein Gerät, ein Modem. Ich spreche mit diesem Modem mit dem Linux-Programm "screen" als Terminalprogramm. Ich rufe es so auf "/usr/bin/screen/dev/tty6". Ich muss ungefähr 6 Befehle pro Sitzung oder so senden. Ich benutze ein Expect-Skript, damit ich den Prozess automatisieren kann. Das Expect-Skript startet den Bildschirmprozess, sendet die Befehle und wird dann beendet.

Dieses System funktioniert gut, wenn ich es von einer Terminalsitzung aus ausführe oder wenn ich es remote mit ssh von einem anderen Rechner aus ausführe. Aber wenn ich cron zum Ausführen benutze, schlägt das fehl. Auf dem lokalen Computer schlägt dies mit einem Fehler wie: spawn id exp6 not open while executing exp_send fehl. Dies geschieht beim dritten Senden im Expect-Skript.

Ich habe versucht, cron für die Remote-Ausführung mit ssh mit den Optionen -t, -tt, -ttt zu verwenden, aber ich erhalte die Fehlermeldung: "Pseudo-terminal will not be allocated because stdin is not a terminal."

Meine Crontabs verfügen über eine Pfadvariable, die meisten Befehle werden jedoch mit einem vollständigen Pfad aufgerufen. Ich bin mir ziemlich sicher.

Ich habe versucht, den Bildschirm mit einer -m -Option zu spawnen, aber es scheint immer noch nicht zu laichen. Das Laichen und Abnehmen des Bildschirms macht in diesem Szenario keinen Sinn. Ein Teil des Problems scheint zu sein, dass das Ausführen eines Bildschirms als Terminalemulator für einen seriellen Anschluss anders ist als der normale Betrieb. Jede Hilfe oder Einsicht wäre sehr dankbar.

Das Expect-Skript hier:

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

-------- die Registerkarte 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"

Die Cron-E-Mail

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

antworten

Anscheinend muss ich nur Folgendes hinzufügen:

TERM=vt100

zu meiner cronfile. Autsch.

Alle arbeiten jetzt.