Если вы загружаете большой файл в Linux через командную строку, есть ли команда, чтобы узнать, если он уже завершен? В настоящее время я проверяю, совпадает ли размер файла с ожидаемым размером файла, но что, если вы не знаете ожидаемый размер файла? В настоящее время ls
показывает точное имя файла (то есть file.zip
) вместо чего-то вроде file.zip.temp
или чего-то еще, даже если файл загружается в данный момент.
6 ответов
Если вам не нужно выполнять 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
Что если вы запускаете более одной команды wget
?
Если вам нужно приспособиться к этому сценарию, то вы можете сделать несколько разных вещей:
- Вы можете передать прогресс в файл с известным именем и проверить это.
- Вы можете заставить идею, которая возникла в вашем вопросе, загрузить во временный файл, а затем во второй команде переименовать его.
Вы можете просто написать токен после завершения процесса, т.е.
wget 'file'; touch file.is.done
Подход lsof
предложенный slhck , вероятно, является лучшим. Если вы хотите использовать другие предложения, связанные с созданием файла после завершения загрузки, используйте &&
вместо ;
так что отчет генерируется, только если загрузка завершается корректно:
wget file && touch file.is.done
Я бы предпочел звуковой сигнал, поэтому, если я начинаю длительную операцию (не только 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
Вы можете запустить wget с опцией -o dl.log, то есть определить файл журнала, который вы можете периодически проверять, видите ли вы (используя регулярное выражение) эту строку.
12:59:48 (126.32 MB/s) - `/path/to/downloaded/file/some_file.zip' saved [95235097/95235097]
на самом деле, вы можете использовать "tail dl.log", чтобы получить только последние несколько строк, вместо того, чтобы читать все целиком.