Чтобы удалить все шлюзы по умолчанию, используя ip
ip route flush 0/0
Ни один из вызовов 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