如何在某些情况下使用 cron 重新启动 apache

如何在某些情况下使用 cron 重新启动 apache

这是我第一次使用 cron。如果可用内存量低于 500 mb,我想重新启动服务器中的 apacher。为此,我编写了以下脚本:

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并通过()将以下行添加到 cron 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 检查内存使用情况时,它并没有减少,因此我意识到 apache 服务器没有重新启动。那么,我该如何让这个脚本可运行呢?

答案1

我建议不要每分钟进行一次检查,而是运行一个无休止的脚本来检查内存阈值并将其作为一项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

apache2.service然后在以下部分中添加重启依赖项[Unit]

PartOf=mem_check.service

依赖关系PartOf=将 的重新启动转发mem_checkapache2

部分=

配置依赖项,类似于 Requires=,但仅限于停止和重新启动单元。当 systemd 停止或重新启动此处列出的单元时,该操作将传播到此单元。请注意,这是一个单向依赖项 — 对此单元的更改不会影响列出的单元。

当在 a.service 上使用 PartOf=b.service 时,此依赖关系将在 b.service 的属性列表中显示为 ConsistsOf=a.service。不能直接指定 ConsistsOf= 依赖关系。

(从https://www.freedesktop.org/software/systemd/man/systemd.unit.html

相关内容