3

Если вы загружаете большой файл в Linux через командную строку, есть ли команда, чтобы узнать, если он уже завершен? В настоящее время я проверяю, совпадает ли размер файла с ожидаемым размером файла, но что, если вы не знаете ожидаемый размер файла? В настоящее время ls показывает точное имя файла (то есть file.zip) вместо чего-то вроде file.zip.temp или чего-то еще, даже если файл загружается в данный момент.

6 ответов6

6

Если вы загружаете с помощью wget , вы можете просто проверить, запущен ли экземпляр:

ps -ef | grep wget | grep -v grep

Также вы можете проверить, открыт ли файл с помощью wget . Очевидно, заменить путь здесь.

lsof /path/to/downloaded/file
3

Если вам не нужно выполнять wget в фоновом режиме, не делайте этого, это только приведет к осложнениям.

Я выступаю против таких решений, как проверка ps -C wget или pidof wget (короче, возможно, не POSIX, эквивалентов ps -ef | grep wget | grep -v grep), поскольку они будут рассматривать любой wget а не только тот, который вас интересует. в, что может быть несомненным предположением, если ваша машина выполняет не только одну задачу.

Если вы находитесь внутри скрипта, вы можете wget & WGETPID=$! а затем проверьте этот PID. Или вы можете просто wait , что подождет окончания ваших фоновых процессов.

Может быть важно что-то сделать, чтобы отличить успешную загрузку от неудачной. if wget ... ; then touch wget_ok ; else touch wget_error ; fi

2

Что если вы запускаете более одной команды wget ?

Если вам нужно приспособиться к этому сценарию, то вы можете сделать несколько разных вещей:

  • Вы можете передать прогресс в файл с известным именем и проверить это.
  • Вы можете заставить идею, которая возникла в вашем вопросе, загрузить во временный файл, а затем во второй команде переименовать его.
  • Вы можете просто написать токен после завершения процесса, т.е.

    wget 'file'; touch file.is.done
    
1

Подход lsof предложенный slhck , вероятно, является лучшим. Если вы хотите использовать другие предложения, связанные с созданием файла после завершения загрузки, используйте && вместо ; так что отчет генерируется, только если загрузка завершается корректно:

wget file && touch file.is.done
0

Я бы предпочел звуковой сигнал, поэтому, если я начинаю длительную операцию (не только wget, но и любое время), которую я не хочу смотреть мгновенно, я использую что-то вроде

`LONG_COMMAND && SOUND_OK || SOUND_ERROR`

так что даже если мне нужно будет сразу же узнать, когда он закончится, я также смогу сделать что-то еще в то же время, не прерывая время от времени проверку, я просто могу услышать результат (SOUND_OK если состояние первой команды выхода равно 0 и SOUND_ERROR в другом случае) и проверьте его только один раз, когда он закончится. Вы даже можете продолжить текущую деятельность, если вам нужно только знать, что ваша задача выполнена. LONG_COMMAND может быть wget , и в качестве SOUND_OK я предпочитаю echo -e "\a" >/dev/console но вы можете использовать команду для воспроизведения любого аудиосэмпла.

Пока wget может генерировать несколько разных кодов выхода, их можно использовать для определения команды тревоги в «стиле bios» следующим образом

wget URL;\
CODE=$?;\
beep;\
[ $CODE -gt 0 ] && while true; do
 for peek in `seq 1 $CODE`; do
 beep; sleep 1;done
sleep 3; done
0

Вы можете запустить wget с опцией -o dl.log, то есть определить файл журнала, который вы можете периодически проверять, видите ли вы (используя регулярное выражение) эту строку.

12:59:48 (126.32 MB/s) - `/path/to/downloaded/file/some_file.zip' saved [95235097/95235097]

на самом деле, вы можете использовать "tail dl.log", чтобы получить только последние несколько строк, вместо того, чтобы читать все целиком.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .