我在 AWS EC2 微型实例上运行 Web 服务器。该实例有 ~630MB 的 RAM。随着时间的推移,我有几个 httpd 进程和很少的可用 RAM。当我重新启动 httpd 服务时,我最终释放了大约 350MB 的 RAM。
我考虑使用 root 下的 cron 任务每 12 小时自动执行一次。我的脚本包含以下代码:
service httpd restart
service mysqld restart
ps aux
free -m
这是我第一次尝试 cron 脚本。
我收到一封电子邮件,其中包含预期的输出ps aux
和free -m
,但是
./scriptName.sh: line 1: service: command not found
./scriptName.sh: line 2: service: command not found
用于重启命令。
脚本确实以 root 身份运行。我担心使用sudo
可能会导致脚本挂起。输出中的相关行ps
-
root 14664 0.0 0.2 142200 1720 ? S 22:41 0:00 CROND
root 14665 0.0 0.2 9296 1236 ? Ss 22:41 0:00 /bin/sh -c ./scriptName.sh
smmsp 14667 0.0 0.6 76020 4244 ? R 22:41 0:00 /usr/sbin/sendmail -FCronDaemon -i -odi -oem -oi -t -f root
root 14669 0.0 0.1 11244 1008 ? R 22:41 0:00 ps aux
要成功重启服务,正确的做法是什么?
做这样的事真的可取吗?
输出free -m
total used free shared buffers cached
Mem: 596 573 23 0 8 71
-/+ buffers/cache: 493 103
Swap: 0 0 0
答案1
主要问题是 cron 的运行环境中没有适当的$PATH
定义,因此您需要使用完整路径才能service
使其工作。
您可以使用命令找出该路径which service
,该命令应该打印类似的内容 /usr/sbin/service
。
第二个问题:我不会这么做,盲目地重启生产系统上的服务永远不是一个好主意。你是否有实际的内存/性能问题,或者你的 RAM 是否只是被缓冲区等占用了(请参阅http://www.linuxatemyram.com/)?
free -m
请将几个小时后的输出添加到您的问题中。
答案2
最好看看 Monit 之类的东西,而不是尝试编写自制的 cron 脚本。
以下是 Apache 的示例配置:
http://mmonit.com/wiki/Monit/ConfigurationExamples#apache
你应该能够做类似的事情:
if totalmem > 300 MB for 2 cycles then alert
在 Apache 块中。
Monit 应该位于其中一个 RPM 存储库中。
答案3
我认为你的做法是错误的。首先研究如何调整 Apache。然后研究 Linux 内存管理。你希望你的服务器使用内存,否则你为什么要拥有它?
答案4
你为什么想要空闲的 RAM?空闲的 RAM 是浪费的 RAM。要么你计算错了空闲的 RAM 数量,没有将缓存内存算作空闲的 RAM(参见linuxatemyram.com)或者你应该调整你的 apache 以减少 MaxClients 的数量,这样 apache 将使用更少的内存。