Удалите вновь созданный файл с помощью скрипта оболочки через 5 минут

#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