我希望这个问题对于这个论坛来说是可以接受的。
我有一个设备,一个调制解调器。我使用 Linux 程序“screen”作为终端程序与此调制解调器通信。我像这样调用它“ /usr/bin/screen /dev/tty6
”。我需要在每个会话中发送大约 6 个命令。我使用一个 expect 脚本,这样我就可以自动化该过程。expect 脚本会生成 screen 进程,发送命令然后退出。
当我从终端会话运行它或使用另一台机器上的 ssh 远程运行它时,该系统运行良好。但是当我使用 cron 运行它时,它失败了。在本地机器上,它会失败并出现如下错误:spawn id exp6 not open while executing exp_send
。它在期望脚本中的第三次发送时出现这种情况。
ssh
我尝试使用 cron和-t
、-tt
、选项进行远程运行,-ttt
但出现错误:“ Pseudo-terminal will not be allocated because stdin is not a terminal.
”
我的 crontabs 有一个路径变量设置,但我很确定大多数命令都是用完整路径调用的。
我尝试使用-m
选项生成屏幕,但显然仍然无法生成。在这种情况下,生成屏幕并将其分离没有任何意义。问题的一部分似乎是将屏幕作为终端仿真器运行到串行端口与正常运行它不同。任何帮助或见解都将不胜感激。
此处的预期脚本:
---做东西.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/本地测试
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。哎哟。
现在一切正常。