在后台睡眠时出现 Unix 内存问题

在后台睡眠时出现 Unix 内存问题

我在 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。您可以检查pstop(查看 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可能会因各种原因而中断。您可能想确保不会比预期提前运行命令。

相关内容