Это - первый раз, когда я использую крон. Я хочу перезапустить apacher в своем сервере, если объем доступной памяти идет меньше чем 500 МБ. Чтобы сделать так, я записал следующий сценарий:
restart_if_memory_full.sh (в/var/www/myapp/)
#!/bin/bash
mem=$(free -m | awk '/Mem:/{print $4}')
(( mem <= 500 )) && (sudo service apache2 restart)
Затем я сделал это исполняемый файл путем выполнения (sudo chmod +x restart_if_memory_full.sh
) и добавил следующую строку к крону (sudo crontab -e
) (Обратите внимание, что я не использовал .sh расширение, как рекомендуется),
* * * * * /var/www/myapp/restart_if_memory_full
Теперь, я проверяю вывод (grep CRON /var/log/syslog
) и посмотрите это:
Nov 11 11:13:01 mardy2 CRON[31963]: (root) CMD (/var/www/myapp/restart_if_memory_full)
Nov 11 11:13:01 mardy2 CRON[31962]: (CRON) info (No MTA installed, discarding output)
Однако, когда я проверяю использование памяти htop, оно не уменьшается, и поэтому я понял, что апачский сервер не был перезапущен. Так, как я могу сделать этот сценарий выполнимым?
Вместо того, чтобы делать проверку каждую минуту, я предложил бы выполнить бесконечную проверку сценария Ваш порог памяти и сделал бы его a systemd
- сервис:
#!/bin/bash
#memory_check.sh
while [[ "free -m | awk '/Mem:/{print $4}'" -lt 500 ]] ; do
sleep 5
done
#service called e.g. mem_check.service
[Unit]
Description=continuously monitors memory
After=apache2
[Service]
ExecStart=/path/to/memory_check.sh
Restart=on-failure
#let's give apache some time:
RestartSec=10s
Затем добавьте перезапуск dependeny к Вашему apache2.service
в [Unit]
раздел с:
PartOf=mem_check.service
PartOf=
зависимость вперед перезапуск mem_check
кому: apache2
.
PartOf =
Настраивает зависимости, подобные, Требует =, но ограниченный остановкой и перезапуском единиц. Когда systemd останавливает или перезапускает единицы, перечисленные здесь, действие распространено к этой единице. Обратите внимание, что это - односторонняя зависимость — изменения в этой единице не влияют на перечисленные единицы.
Когда PartOf=b.service будет использоваться на a.service, эта зависимость покажет как ConsistsOf=a.service в списке свойств b.service. ConsistsOf = зависимость не может быть указан непосредственно.
(из https://www.freedesktop.org/software/systemd/man/systemd.unit.html)