освободить память после выполнения задачи в cron

Установка, обновление, настройка Linux

Модераторы: Olej, adminn

SergMir
Активист
Сообщения: 15
Зарегистрирован: 20 апр 2023, 14:22
Контактная информация:

освободить память после выполнения задачи в cron

Непрочитанное сообщение SergMir » 23 ноя 2023, 09:30

подскажите пожалуйста: как освобождать память после выполнения задачи. которая запущена в кроне. Вчера добавил задачу в кроне - копирование файлов, а утром память сервера почти закончилась и сервер еле ворочался, пришлось перезагружать

в кроне задача прописана так:

* * * * * /var/www/infobez-site/asukd/copy_req.sh >> /var/log/_cron_auto_copy_req.log

скрипт copy_req.sh запускается каждые 5 секунд

while :; do sleep 5; flock -n /var/tmp/lock1 -c "php /var/www/infobez-site/asukd/auto_copy_req.php" & done

все работает хорошо, только память не освобождается

Red Hat EL v8.5

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

освободить память после выполнения задачи в cron

Непрочитанное сообщение Olej » 23 ноя 2023, 12:22

SergMir писал(а):
23 ноя 2023, 09:30
все работает хорошо, только память не освобождается
я так понял, что речь у вас идёт о переполнении не памяти, а дискового пространства?

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

освободить память после выполнения задачи в cron

Непрочитанное сообщение Olej » 23 ноя 2023, 13:37

SergMir писал(а):
23 ноя 2023, 09:30
как освобождать память после выполнения задачи. которая запущена в кроне.
Я не вникал глубоко в детали задачи и её решения - она недостаточно детально описана ... это можно, после уточнения, обсуждать.
Но, при самом поверхностном взгляде, у вас логическая неправильность в решении:
1. cron предназначен для того, чтобы периодически, время от времени, запускать какое-то действие...
2. действием у вас запускается задача, которая бесконечно в цикле, через каждые там 5 секунд, выводит что-то в логи...
3. cron будет, время от времени, запускать экземпляр задачи из п.2, таких (бесконечных циклических) задач будет 2, 3 ... 5 ... 100 ... штук...
4. и конечно они завалят таким бесконечным шкввалом любое дисковое пространство.

SergMir
Активист
Сообщения: 15
Зарегистрирован: 20 апр 2023, 14:22
Контактная информация:

освободить память после выполнения задачи в cron

Непрочитанное сообщение SergMir » 23 ноя 2023, 13:42

Olej писал(а):
23 ноя 2023, 12:22
SergMir писал(а):
23 ноя 2023, 09:30
все работает хорошо, только память не освобождается
я так понял, что речь у вас идёт о переполнении не памяти, а дискового пространства?
место на диске не увеличивается, а кеш растет

SergMir
Активист
Сообщения: 15
Зарегистрирован: 20 апр 2023, 14:22
Контактная информация:

освободить память после выполнения задачи в cron

Непрочитанное сообщение SergMir » 23 ноя 2023, 13:55

Olej писал(а):
23 ноя 2023, 13:37

Но, при самом поверхностном взгляде, у вас логическая неправильность в решении:
...
3. cron будет, время от времени, запускать экземпляр задачи из п.2, таких (бесконечных циклических) задач будет 2, 3 ... 5 ... 100 ... штук...
4. и конечно они завалят таким бесконечным шкввалом любое дисковое пространство.
действительно так и получается.
Поэтому в /etc/crontab добавил строку:
* * * * * flock -n /tmp/lock2 -c /var/www/infobez-site/asukd/copy_req.sh

т.е. каждую минуту крон будет пытаться запустить вторую копию скрипта, если lock2 занят - то запускать не будет.
но память кеша все равно растет

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

освободить память после выполнения задачи в cron

Непрочитанное сообщение Olej » 23 ноя 2023, 13:56

SergMir писал(а):
23 ноя 2023, 13:42
место на диске не увеличивается, а кеш растет
Я этого не понял...
SergMir писал(а):
23 ноя 2023, 09:30
* * * * * /var/www/infobez-site/asukd/copy_req.sh >> /var/log/_cron_auto_copy_req.log
У вас результат выполнения скрипта, вывод перенаправляется (дописывается) в файл /var/log/_cron_auto_copy_req.log
Какой кэш (растёт)? Как вы его смотрите?
Что там должен писать ваш PHP код?
Пишет ли он действительно в stdout и не пишет ли он это (или ещё что-то) в stderr, который не перенаправляется конвейером >> ?

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

освободить память после выполнения задачи в cron

Непрочитанное сообщение Olej » 23 ноя 2023, 13:58

SergMir писал(а):
23 ноя 2023, 13:55
Поэтому в /etc/crontab добавил строку:
* * * * * flock -n /tmp/lock2 -c /var/www/infobez-site/asukd/copy_req.sh
Вообще то, у вас в 1-м сообщении написано совсем другое:
SergMir писал(а):
23 ноя 2023, 09:30
в кроне задача прописана так:

* * * * * /var/www/infobez-site/asukd/copy_req.sh >> /var/log/_cron_auto_copy_req.log

SergMir
Активист
Сообщения: 15
Зарегистрирован: 20 апр 2023, 14:22
Контактная информация:

освободить память после выполнения задачи в cron

Непрочитанное сообщение SergMir » 23 ноя 2023, 14:06

Olej писал(а):
23 ноя 2023, 13:56
У вас результат выполнения скрипта, вывод перенаправляется (дописывается) в файл /var/log/_cron_auto_copy_req.log
Какой кэш (растёт)? Как вы его смотрите?
Что там должен писать ваш PHP код?
Пишет ли он действительно в stdout и не пишет ли он это (или ещё что-то) в stderr, который не перенаправляется конвейером >> ?
- растет страничный кеш (cat /proc/meminfo)
- сам php-код выполняет копирование файлов. При запуске скрипта на сервере в ручном режиме отрабатывает правильно.
- в лог результат пишет

SergMir
Активист
Сообщения: 15
Зарегистрирован: 20 апр 2023, 14:22
Контактная информация:

освободить память после выполнения задачи в cron

Непрочитанное сообщение SergMir » 23 ноя 2023, 14:07

Olej писал(а):
23 ноя 2023, 13:58
SergMir писал(а):
23 ноя 2023, 13:55
Поэтому в /etc/crontab добавил строку:
* * * * * flock -n /tmp/lock2 -c /var/www/infobez-site/asukd/copy_req.sh
Вообще то, у вас в 1-м сообщении написано совсем другое:
SergMir писал(а):
23 ноя 2023, 09:30
в кроне задача прописана так:

* * * * * /var/www/infobez-site/asukd/copy_req.sh >> /var/log/_cron_auto_copy_req.log
уже изменил строку в кроне - добавил блокировку файла для предотвращения повторного запуска

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

освободить память после выполнения задачи в cron

Непрочитанное сообщение Olej » 23 ноя 2023, 14:14

SergMir писал(а):
23 ноя 2023, 13:55
т.е. каждую минуту крон будет пытаться запустить вторую копию скрипта, если lock2 занят - то запускать не будет.
Логика порочная: либо cron для запуска периодических действий (каждую минуту), либо свой бесконечный цикл: до бесконечности делать что-то каждые 5 секунд.

Что вы хотите по логике поведения?
В таком виде (с flock) у вас 1-й экземпляр скрипта, запущенный cron, будет на бесконечное время (он ведь никгдва не закаечивается?) блокировать /tmp/lock2 и все следующие попытки запуска cron будут откладываться "на потом" ... и что и как там будет переполняться - это уже только вопрос времени.

P.S. Вообще, использовать блокировки для выполнения переллельных действий (в любых языках или программных средах) - очень опасная (или сложная) практика. А использование в этом качестве flock - вдвойне.

Ответить

Вернуться в «Администрирование Linux»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 8 гостей