这是我第一次使用 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_check
至apache2
。
部分=
配置依赖项,类似于 Requires=,但仅限于停止和重新启动单元。当 systemd 停止或重新启动此处列出的单元时,该操作将传播到此单元。请注意,这是一个单向依赖项 — 对此单元的更改不会影响列出的单元。
当在 a.service 上使用 PartOf=b.service 时,此依赖关系将在 b.service 的属性列表中显示为 ConsistsOf=a.service。不能直接指定 ConsistsOf= 依赖关系。
(从https://www.freedesktop.org/software/systemd/man/systemd.unit.html)