У меня есть сценарий Perl, который содержит этот фрагмент кода, который вызывает системную оболочку для получения некоторых файлов по SFTP и разархивирования их с помощью WinZip:
# Run script to get files from remote server
system "exec_SFTP.vbs";
# Unzip any files that were retrieved
foreach $zipFile (<*.zip>) {
system "wzunzip $zipFile";
}
Даже если некоторые файлы извлекаются, они никогда не распаковываются, потому что к тому моменту, когда файлы извлекаются и соединение SFTP закрывается, скрипт Perl уже завершил этап распаковки, в результате чего он ничего не находит расстегнуть молнию.
Мое краткосрочное исправление - вставить
sleep(60);
перед этапом распаковки, но это предполагает, что соединение SFTP завершится в течение 60 секунд, что иногда может быть грубой завышенной оценкой, а в других случаях заниженной оценкой.
Есть ли более разумный способ заставить Perl приостановить работу, пока SFTP-соединение не будет закрыто, прежде чем приступить к операции распаковки?
Редактировать: Ответчики подвергли сомнению (и вполне обоснованно) использование сценария VB вместо того, чтобы Perl выполнял передачу файла. Это связано с безопасностью - скрипт VB поддерживается другими пользователями и имеет право выполнять SFTP.