我在 Linux 服务器上工作,它不允许我使用cron
.因此,为了绕过这个问题,我编写了需要在确定时间运行的脚本,如下所示:
while true
do
...
...
sleep 1d #changes upon requirement of my script
done
我总是在后台启动脚本nohup ./script.sh &
。
我的问题是,假设我有六/七个这样的脚本在服务器上运行 - 大多数时候它们都在睡觉。这会sleep
消耗某种内存吗?会影响服务器的性能吗?有什么有效的方法来处理这个问题吗?
答案1
是的——这些脚本正在消耗内存。实际上,您已经使用内存运行了两个进程:
- 一个 shell(例如 bash)
sleep
本身。
sleep
将会非常轻量级,但是 shell 可能会消耗几兆字节的内存。在我的系统上,空闲的非交互式 bash 消耗约 1MiB,睡眠消耗 0.7MiB。您可以检查ps
或top
(查看 RSS 列)——尽管其中很多实际上是诸如库之类的东西,它们在使用它们的所有进程之间共享。总而言之,每个可能 <1MiB。
在 Linux 上,您可以从/proc/pid/status
( 和/proc/pid/smaps
) 获取更多详细信息;这些Vm*
是这里感兴趣的。例如:
bash -c 'grep Vm /proc/$$/status'
VmPeak: 13380 kB
VmSize: 13380 kB
VmLck: 0 kB
VmPin: 0 kB
VmHWM: 972 kB
VmRSS: 972 kB
VmData: 220 kB
VmStk: 132 kB
VmExe: 208 kB
VmLib: 2320 kB
VmPTE: 48 kB
VmPMD: 12 kB
VmSwap: 0 kB
您可以看到总 RSS(已用 RAM 量)为 972 kB,其中 220 kB 是“数据”(通常不共享),132 kB 是堆栈(也不共享)。因此,剩余运行的每个额外的 bash 都非常小。
一些忠告:如果你必须做一堆像这样的解决方法......为什么你不能使用 cron?这是一种更简单、更干净的方法,不太可能出现意外错误(快速!如何sleep 1d
处理夏令时更改?如果您的睡眠提前返回,因为它是作为重新启动/关闭的一部分而发出的 SIGTERM 信号,会发生什么?)。如果您的系统管理员担心未经授权的人安排 cron 作业,请向他/她指出/etc/cron.allow
和/etc/cron.deny
;这些记录在 crontab(1) 中。
答案2
sleep
旨在几乎不消耗任何资源。
但请注意,该过程sleep
可能会因各种原因而中断。您可能想确保不会比预期提前运行命令。