Почему эта программа не копирует все мои файлы, используя scp? - PullRequest
0 голосов
/ 22 мая 2018

Я написал небольшую программу, которая в первом случае нарезает список файлов и имен каталогов, чтобы получить список файлов и список каталогов.

#!/usr/bin/expect -f

set mdproot "****"
set mySource "****"
set myDest "****"
set myDirs {}
set myFiles {}
set i 1
set y 0

lappend myDirs [lindex $argv 0]

foreach variable $argv {
    lappend myDirs [lindex $argv $i+1]
    lappend myFiles [lindex $argv $y+1]
    incr y
    incr y
    incr i
    incr i
}

set DIRECTORIES [lsearch -all -inline -not -exact $myDirs {}]
set FILES  [lsearch -all -inline -not -exact $myFiles {}]

#puts "   "
#puts $DIRECTORIES
#puts "   "
#puts $FILES

foreach file $FILES dir $DIRECTORIES  {
    puts " Fichier : $file et repertoire : $dir"
    spawn scp -p "$mySource/$file" "$myDest/$dir"
    expect -re "(.*)assword: " {sleep 1; send -- "$mdproot\r" }
    expect  eof { return}
}

Вот мои списки:

$argv:

2017-11-30 
2017-11-30_15-10-44_P_8294418.33_Q1 
2017-11-30 
2017-11-30_15-10-44_R_8294418.33_Q1 
2018-03-07 
2018-03-07_09-30-57_R_HOURS_Q1 
2018-04-13 
2018-04-13_13-23-25_R_HOURS_Q1 
2018-05-02 
2018-05-02_11-19-37_R_HOURS_Q1 
2018-03-07 
2018-3-7_9-30-57_P_HOURS_Q1 
2018-04-13 
2018-4-13_13-23-25_P_HOURS_Q1 
2018-05-02 
2018-5-2_11-19-37_P_HOURS_Q1

$DIRECTORIES:

2017-11-30 
2017-11-30 
2018-03-07 
2018-04-13 
2018-05-02 
2018-03-07 
2018-04-13 
2018-05-02

$FILES:

2017-11-30_15-10-44_P_8294418.33_Q1 
2017-11-30_15-10-44_R_8294418.33_Q1 
2018-03-07_09-30-57_R_HOURS_Q1 
2018-04-13_13-23-25_R_HOURS_Q1 
2018-05-02_11-19-37_R_HOURS_Q1 
2018-3-7_9-30-57_P_HOURS_Q1 
2018-4-13_13-23-25_P_HOURS_Q1 
2018-5-2_11-19-37_P_HOURS_Q1

На самом деле у меня 2 проблемы (3 в случае, если мы посчитаем, насколько мусор этот код).Во-первых, когда я запускаю свою программу, у меня есть индикатор% для каждого файла, который я копирую, и, кроме последнего, все они останавливаются, прежде чем достигнут 100%.Затем я вижу, что команда scp не выполняется для всех файлов, программа останавливается почти каждый раз на 4-м файле.

root@raspberrypi:~# ./recupFileName.sh 

spawn scp -p /root/muonic_data/2017-11-30_15-10-44_P_8294418.33_Q1 marpic@192.168.110.90:/home/marpic/muonic_data/Data_Q1/2017-11-30
marpic@192.168.110.90's password: 
2017-11-30_15-10-44_P_8294418.33_Q1            15%   68MB   6.9MB/s   00:53 
spawn scp -p /root/muonic_data/2017-11-30_15-10-44_R_8294418.33_Q1 marpic@192.168.110.90:/home/marpic/muonic_data/Data_Q1/2017-11-30
marpic@192.168.110.90's password: 
2017-11-30_15-10-44_R_8294418.33_Q1            41%   69MB   8.5MB/s   00:11 
spawn scp -p /root/muonic_data/2018-03-07_09-30-57_R_HOURS_Q1 marpic@192.168.110.90:/home/marpic/muonic_data/Data_Q1/2018-03-07
marpic@192.168.110.90's password: 
2018-03-07_09-30-57_R_HOURS_Q1                 82%   51MB   7.2MB/s   00:01 
spawn scp -p /root/muonic_data/2018-04-13_13-23-25_R_HOURS_Q1 marpic@192.168.110.90:/home/marpic/muonic_data/Data_Q1/2018-04-13
marpic@192.168.110.90's password: 
2018-04-13_13-23-25_R_HOURS_Q1                100% 6940KB   6.8MB/s   00:01

Как видите, должно быть 8файлы копируются с 100% точностью, но сообщений об ошибках нет, поэтому я не знаю, с чего начать свое исследование.

РЕДАКТИРОВАТЬ:

Я добавил "набор"timeout -1 "в моем сценарии, но теперь сценарий копирует только мой первый файл со 100% точностью, затем останавливается.Есть ответы?

root@raspberrypi:~# ./recupFileName.sh 
 Fichier : 2017-11-30_15-10-44_P_8294418.33_Q1 et repertoire : 2017-11-30
spawn scp -p /root/muonic_data/2017-11-30_15-10-44_P_8294418.33_Q1 marpic@192.168.110.90:/home/marpic/muonic_data/Data_Q1/2017-11-30
marpic@192.168.110.90's password: 
2017-11-30_15-10-44_P_8294418.33_Q1           100%  437MB   7.5MB/s   00:58    
root@raspberrypi:~# 

1 Ответ

0 голосов
/ 22 мая 2018

Проблема должна быть в expect eof.По умолчанию timeout равно 10 секундам, поэтому expect eof вернется через 10 секунд, хотя scp все еще работает.

Вы можете использовать большее значение timeout.

Опция № 1:

# set the default `timeout'
set timeout 3600 ; # or -1 for no timeout

Опция № 2:

expect -timeout 3600 eof

Обратите внимание, что ваш

expect eof { return }

завершит работу всего сценария, поэтому foreachцикл запускается только один раз, вам нужно всего лишь

expect eof
...