Я не уверен, что происходит, но предполагаю, что столбец% CPU отдельного процесса не говорит вам то, что, по вашему мнению, он говорит вам. Из страницы руководства сверху:
k: %CPU -- CPU usage
The task’s share of the elapsed CPU time since the last screen update,
expressed as a percentage of total CPU time.
Допустим, вы обновляетесь каждые 4 секунды. Общее время процессора, затраченное на эти 2 секунды, составляет 6% за эти 4 секунды . Но допустим, в одну из этих секунд он вырвался и использовал 24% процессорного времени. Я не говорю, что это происходит, но может быть.
Я доволен верхним
здесь.Я вижу использование ЦП с разбивкой по ЦП и далее по пользователем
, sys
, красиво
, простаивает
, подождите
] (по вводу-выводу), обслуживающему аппаратные и программные прерывания (привет, си). Вы, вероятно, также можете найти это в htop
. Пока у вас есть 1 процессор, который простаивает не менее 20%, вам не о чем беспокоиться, если только ваш вентилятор не беспокоит вас. Но если вы беспокоитесь, возможно, что происходит,% wait и% hi /% si очень высоки, и в этом случае ни один отдельный процесс не имеет высокой загрузки ЦП, а скорее ядро по какой-то причине очень занято.
Окончательное решение состоит в том, чтобы переключиться с sed на Perl, который обрабатывает переменные как объекты первого класса, а не как макросы для расширения, как это делает оболочка.
path=/path/to/scriptdir parameters="para1 para2" perl -i~ -pe \
's|^replace.*$|$ENV{path}/script $ENV{parameters}|g' -- "$filetochange"
-p
считывает ввод построчно и печатает каждую строку после обработки %ENV
содержит переменные окружения, назначение которых в начале команды делает их экспортируемыми для команды s///
(меняйте разделители по своему усмотрению )работает аналогично sed, см. perlop( 1 )Не не используйте для этого переменную PATH
. Он имеет особое значение для оболочки. Я выбираю SCRIPTDIR
здесь:
SCRIPTDIR="/path/to/scriptdir"
PARAMETERS="para1 para2"
FILETOCHANGE="/foo/bar"
(2 )Вам не нужна косая черта(/
)как таковая в команде подстановки sed:s#this#that#
или s|this|that|
работает так же, как s/this/that/g
. Sed просто использует символ сразу после s
в качестве разделителя для остальной части командыs
(замены ). Вы можете использовать это, чтобы избежать проблемы с косой чертой в вашем шаблоне и строке замены :, когда вы используете, например. |
как разделитель косая черта не имеет особого значения для sed.
Итак, это сработает:
sed "s%^replace.*$%$SCRIPTDIR/script $PARAMETERS%g" $FILETOCHANGE