What bash script concept am I missing? Threads, maybe?
Управление заданиями. Вы можете запускать процессы в фоновом режиме и осуществлять довольно тонкий -детальный контроль над ними, зная их идентификатор процесса и статус завершения.
Чтобы получить PID фоновой команды, используйте переменную $!
.
Чтобы получить статус завершения фоновой команды, используйте wait()
и укажите ее PID. Обратите внимание: вызовы wait()
будут заблокированы, если команда еще не завершилась . Если эта блокировка является проблемой (, это может быть в вашем случае ), вы можете выполнить проверки с помощьюps
(или другого метода )перед вызовом wait()
, чтобы увидеть, готов ли ваш процесс к сбору урожая, обычно в цикле, где есть сторожевой таймер или какой-либо другой способ установки ограничения на время выполнения задачи.
Рассмотрим следующий шаблон на основе цикла:
complete=0
cycles=0
# Task 1
sleep 200 &
pid=$!
while [[ complete -eq 0 ]]; then
ps -o pid= -p $pid > /dev/null
if [[ $? -ne 0 ]]; then
# Signal complete to logic below
complete=1
break;
fi
# Perform some timeout / cycle check to give up on this task
cycles=$((cycles + 1))
if [[ $cycles -gt 100 ]]; then # whatever, this is just a simple watchdog example
break;
fi
# Optional sleep
sleep 1
done
if [[ $complete -eq 1 ]]; then
# Process the command's exit status
wait $pid
if [[ $? -ne 0 ]]; then
: # handle command failed perhaps
else
: # do other things, assuming exit of 0 is a good thing
fi
else
# Process a command watchdog failure
kill -9 $pid # come what may
fi
Для более сложного управления заданиями вы можете переместить проверку команд и управление циклами в функции bash и значительно очистить этот код.
Я рекомендую вам просмотреть 2 вещи.
1. Просмотрите разрешения Если вы не запускаете скрипт как root, проверьте разрешения. /usr/share/backgrounds принадлежит пользователю root, и для записи в него потребуется действие суперпользователя:
sudo cp "$file" /usr/share/backgrounds/wall.png
2. Просмотрите путь Если разрешения правильные, то проверьте путь.
Предоставленный вами пример кода пытается скопировать файл в /usr/share/background . Попробуйте изменить его следующим образом:
cp "$file" /usr/share/backgrounds/wall.png
Обратите внимание, что это фон s(множественное число ).