Como sair automaticamente do processo atual de cópia?

2

Estou tentando copiar o conteúdo da minha pasta de origem para a pasta de destino montada. O que eu fiz foi montar 4 dispositivos dando o ip para /etc/fstab .

//192.168.100.1/C1 /media/Client_1 smbfs guest 0 0

//192.168.100.2/C2 /media/Client_2 smbfs guest 0 0

//192.168.100.2/C3 /media/Client_3 smbfs guest 0 0

//192.168.100.2/C4 /media/Client_4 smbfs guest 0 0

e, em seguida, usando o script python, estou tentando copiar os arquivos para todas as pastas Client_1, Client_2,3 e 4. A linha abaixo é usada para copiar o arquivo para pastas montadas.

os.system("cp -f sourcepath/* /media/C1" %locals())
os.system("cp -f sourcepath/* /media/C2" %locals())
like C3 and C4 folders

O arquivo está se movendo corretamente. Mas, o problema é que, se ocorrer algum problema de rede durante a cópia do conteúdo, o script não será movido para a próxima linha, o processo estará aguardando até que a rede volte novamente. Dos 4 dispositivos montados, se o C2 tiver um problema, o script terminará o c2 e tentará mover o conteúdo para c3 e c4. Eu estou lutando neste lugar. Se você sabe, me deixe.

Nota: eu posso entender -f significa força, se um arquivo de destino existente não pode ser aberto, remova-o e tente novamente. Que argumento eu preciso usar para copiar o conteúdo para a pasta montada, se algum problema de rede acontecer, é necessário terminar essa pasta de cópia.

    
por Viswa 16.11.2012 / 14:05

1 resposta

2

Por mais que eu goste de python, isso não é realmente um caso para o qual é necessário. O problema aqui é que quando uma conexão smb falha, as operações cp congelam ao invés de terminarem. Nem o python nem o bash detectarão isso.

Então, você pode iniciar todos os trabalhos em paralelo

user@host:~$ for dest in /media/Client_{1,2,3,4}; do cp -f sourcepath/* $dest & done

Mas isso provavelmente vai sufocar sua rede. Uma opção melhor pode ser deixar o CP executar por uma duração esperada e depois matá-lo se tiver congelado

user@host:~$ for dest in /media/Client_{1,2,3,4}; do timeout -k 9 30m cp -f sourcepath/* $dest; done

O qual irá matar o comando cp com SIGKILL (sinal 9) após 30 minutos se ele estiver desativado.

No entanto, se precisar reiniciar a transferência for um problema freqüente, você provavelmente usará rsync em vez de cp , o que verificará o que já foi copiado e continuará onde quer que tenha chegado.

    
por chronitis 16.11.2012 / 15:13