#linux #shell #cron #scheduled-tasks #script
Вопрос:
Я пишу сценарий оболочки, в котором я создаю файл ABC.txt
по пути /path/to/ABC/ABC.txt
.
Теперь я в конце сценария хочу запланировать задание cron для удаления этого файла через 5 минут (только один раз, не повторяется).
Я не могу рекламировать sleep
5 минут в этом скрипте, так как он используется несколькими пользователями на сервере для нескольких путей/файлов. И через 5 минут после того, как пользователь выполнит этот скрипт, соответствующий file.txt
из соответствующего пути должен быть удален.
Что я прочитал в cronjob, так это то, что вы можете запустить скрипт, используя, crontab -e
а затем периодически указывая задание и путь к сценарию H/5 * * * * /bin/sh /path/to/ABC/ABC.txt
.
Может ли кто-нибудь сказать мне, как запланировать такую функциональность с помощью cron. Если есть лучший способ сделать это, пожалуйста, предложите.
Комментарии:
1. Не было
at
бы более подходящей работы? cron предназначен для периодических заданий, по крайней мере, для заданий, выполняемых один раз. Другая возможность состоит в том, чтобы отключить процесс «сна и удаления» из вашего скрипта, переведя его в фоновый режим, т. Е.(sleep 5; delete ABC.txt) amp;
2. разве сон не вызовет дополнительную нагрузку на процессор в течение 5 минут, потому что родительский процесс (сценарий) не завершен? я создаю этот скрипт для нескольких пользователей, так что, возможно, 100 пользователей выполняют этот скрипт одновременно. будет ли это узким местом?
3. Если бы я узнал, что режим сна реализуется циклом занятости , я бы переформатировал свой жесткий диск и установил операционную систему, которая заслуживает своего имени (Linux, BSD Unix,….). Основным недостатком «сна» является то, что если кто — то перезагрузит компьютер во время сна, файл не будет удален, в то время как с
at
— по крайней мере, AFIK, не использовал команду целую вечность-удаление будет выполнено после перезагрузки. Если это проблема, вы можете спросить об этом в целях безопасности у суперпользователя .4. Я реализовал
sleep 300
все как есть за считанные секунды. и это работает. Я бы обновил это с увеличением числа пользователей в ближайшее время. будет читатьat
и обновлять
Ответ №1:
Используя at
команду:
#!/usr/bin/env bash
script_path="$(realpath -s -- "$0")"
# start script
...
# end script
echo "rm -- "$script_path"" | at "now 5 minutes"
Использование фонового процесса со сном:
#!/usr/bin/env bash
script_path="$(realpath -s -- "$0")"
# start script
...
# end script
( sleep 300 amp;amp; rm -- "$script_path" ) amp;
Использование родительского selfdestruct
процесса:
Напишите небольшой сценарий selfdestruct
, который выглядит так:
#!/usr/bin/env bash
dt="$1"; shift
"$@"
( sleep "$dt" amp;amp; rm -- "$1" ) amp;
и запустите свой сценарий с помощью
$ selfdestruct 300 /path/to/script arg1 arg2 arg3