Как получить команды в сценарии bash для выполнения? (файлы обрезаются с помощью cp)

Чтобы удалить все шлюзы по умолчанию, используя ip

ip route flush 0/0
1
10.04.2019, 17:21
2 ответа

Вы должны изменить маску на ВХОД _ЗАКРЫТЬ _ЗАПИСАТЬ

0
27.01.2020, 23:41

Ни один из вызовов waitничего не сделает в вашем скрипте, так как нет фоновых задач. Вы можете безопасно удалить их.

Я бы тоже удалил звонки на sleep. Они будут только задерживать выполнение скрипта в этих точках. Команда не запустится до тех пор, пока предыдущая не завершится должным образом. Также sleep1может вызвать ошибку «команда не найдена».

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

tar -xzf /home/my_user/local_ready/*.tar.gz -C /home/my_user/local_restore/

Если в /home/my_user/local_readyесть несколько архивов, эта команда извлечет первый и попытается извлечь имена других архивов из этого архива. Флаг -fпринимает один архив, и вы не можете извлечь несколько архивов одновременно.

Вместо этого используйте цикл:

for archive in /home/my_user/local_ready/*.tar.gz; do
    tar -xzf "$archive" -C /home/my_user/local_restore/
done

Я проигнорировал соображения о том, что произойдет, если этот сценарий запустится одновременно с самим собой. Вы упомянули, что у вас есть возможность выполнить сценарий при появлении нового файла, но неясно, что произойдет, если два или более файлов появятся примерно в одно и то же время. Поскольку сценарий обрабатывает все файлы за один вызов, я почти уверен, что два параллельно работающих сценария вполне могут наступить друг другу на пятки.

Лично я мог бы вместо этого запускать скрипт с регулярным пятиминутным интервалом. В качестве альтернативы используйте какую-либо форму блокировки, чтобы убедиться, что сценарий не работает, пока другая копия сценария уже выполняется (, см., например,. " Правильная блокировка в сценариях оболочки? " ).

Вот моя собственная переработка вашего кода (без какой-либо блокировки):

#!/bin/sh -e

cd /home/my_user

# clear directories
rm -f local_ready/*
rm -f local_restore/*

# Alternatively, remove directories completely
# to also get rid of hidden files etc.:
#
#  rm -rf local_ready;   mkdir local_ready
#  rm -rf local_restore; mkdir local_restore

# handle the archives, one by one
for archive in drop/*.tar.gz; do
    tar -xzf "$archive" -C local_restore
    cp "$archive" current
    mv "$archive" local_ready
done

Это очистит каталоги от не -скрытых имен, а затем извлечет каждый архив. После извлечения архива он будет скопирован в каталог local_ready, а затем архив также будет перемещен из dropв current.

Я использую sh -e, чтобы скрипт завершался при ошибках, и я cdв каталог /home/my_user, чтобы избежать длинных путей в скрипте (это также упрощает перемещение всей операции в подкаталог или в другое место позже ). Я использую rm -fдля очистки этих каталогов, так как rmбудет жаловаться, если глобус *не расширится ни на что.

Очевидно, что вы также можете обрабатывать архивное копирование и извлечение отдельно:

cp drop/*.tar.gz current
mv drop/*.tar.gz local_ready

for archive in local_ready/*.tar.gz; do
    tar -xzf "$archive" -C local_restore
done

Чтобы сэкономить место, вы можете изучить жесткие -ссылки на файлы в local_readyи current:

.
mv drop/*.tar.gz local_ready

for archive in local_ready/*.tar.gz; do
    ln "$archive" current
    tar -xzf "$archive" -C local_restore
done
1
27.01.2020, 23:41

Теги

Похожие вопросы