linux - 每隔 x(毫秒)暂停一个 shell 脚本以减少立即的 CPU 使用率

标签 linux bash shell ubuntu terminal

我有一个 shell 脚本,它每小时备份一次我的 MySQL 数据库。这是一个基本脚本:

mysqldump --user=$USER --password=$PASS $DB > /$PATH/$DATE.sql &&
7z a -t7z -mx=9 /$PATH/$DATE.sql.7z /$PATH/$DATE.sql &&
rm /$PATH/$DATE.sql

我使用的是 7z 压缩,因为:

  • 不需要保留文件权限和所有者/组
  • 与 gzip 相比,7z 节省的空间对我来说至关重要

令我困扰的是,7z 部分(第 2 行)大约需要 30 秒,并且在此期间使用了相当多的 CPU。从这开始,我的服务器负载图表每小时都​​有 50% 的峰值,我想摆脱这些峰值。

我已经用 nice 执行了这个脚本:

0 * * * * /usr/bin/nice -n 19 /path/to/backup.sh > /dev/null

此时我能想到的唯一解决方案是以某种方式暂停 7z 部分的执行,假设每秒暂停 1 秒。这可以为其他进程释放 CPU 时间。

这可能吗?

我在我的 .php 脚本中做了类似的事情,尽管停顿在循环中,例如:

while($d=mysqli_fetch_assoc($q)){
   usleep(250000);
   // process $d
}

我希望 7z 执行每隔 X(某事)休眠 1 秒。

最佳答案

你可以使用

prlimit --cpu=10 7z a -t7z -mx=9 /$PATH/$DATE.sql.7z /$PATH/$DATE.sql

这会将 cpu 使用率限制在 10%

关于linux - 每隔 x(毫秒)暂停一个 shell 脚本以减少立即的 CPU 使用率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21856912/

相关文章:

java - 如何在核心转储文件中检查 Java 应用程序的内存泄漏?

linux - 在 Linux 上从另一台计算机复制目录

python - mailutils 无法通过 python 中的 subprocess.run 工作

Bash波浪号扩展

php - Linux - 通过 PHP 创建用户

linux - 类 Unix 系统中的循环符号链接(symbolic link)有什么用?

bash - Fish shell中运行脚本的目录

linux - 用mtime查找不起作用

delphi - TDirectoryWatch 第一次未触发

c - 用execl中的变量替换字符串值并停止执行