Я звоню cpulimit
из cron
:
00 16 * * * /usr/bin/cpulimit --limit 20 /bin/sh /media/storage/sqlbackup/backups.sh
Когда задание запускается, ЦП резко нагружается и выдает предупреждения, как и всегда, без фактического идентифицируемого предела. Само задание проходит по каталогу со многими подкаталогами и выполняет rsync
' каждый раз, что, как я полагаю, порождает rsync
дочерние процессы (запуск top будет иметь pid, доступный для вызываемого rsync, который через несколько минут будет иметь другой pid для rsync
).
Я не уверен, как правильно использовать cpulimit
этот процесс, чтобы эффективно ограничить его использование.
Важно помнить, что это виртуальная машина с 2 ГБ ОЗУ и 1 виртуальным ЦП.
решение1
По умолчанию cpulimit
не ограничивает дочерние процессы, поэтому rsync
не ограничивается вообще. Если вы используете достаточно свежую версию, cpulimit
вы должны иметь возможность использовать --include-children
(или-i
). (См. такжеэтот ответ.)
$ cpulimit -h
Usage: cpulimit [OPTIONS...] TARGET
OPTIONS
-l, --limit=N percentage of cpu allowed from 0 to 400 (required)
-v, --verbose show control statistics
-z, --lazy exit if there is no target process, or if it dies
-i, --include-children limit also the children processes
-h, --help display this help and exit
TARGET must be exactly one of these:
-p, --pid=N pid of the process (implies -z)
-e, --exe=FILE name of the executable program file or path name
COMMAND [ARGS] run this command and limit it (implies -z)
Report bugs to <[email protected]>.
Это изменит вашу запись cron на:
00 16 * * * /usr/bin/cpulimit --include-children --limit 20 /bin/sh /media/storage/sqlbackup/backups.sh
EDIT: Как ответили OP (сами), это сработает для cpulimit
команд rsync
внутри скрипта, но это не гарантирует, что ваш скрипт будет работать хорошо, пока он выполняет другие функции. Например, если скрипт должен обрабатывать большой каталог, он может затормозить систему и вызвать скачок нагрузки на процессор и оповещение.