Запуск:
perl -e '$a="x"x1000000000;sleep(10);print"done\n"'
занимает 1,8 ГБ ОЗУ. Итак, вы ожидаете, что выполнение этого:
perl -e '$a="x"x1000000000;fork;fork;fork;fork;sleep(10);print"done\n"'
займет в 16 раз больше. Но это не так.
Это связано с интеллектуальной функцией копирования при записи в ядре Linux: поскольку содержимое '$ a' не изменяется, память '$ a' может использоваться совместно. Но он останется общим только до тех пор, пока не будет изменен «$ a». Когда это произойдет, измененный раздел будет скопирован и начнет занимать оперативную память.
Я не знаю, можете ли вы измерить, какой объем памяти является избыточным при копировании при записи. Но, по крайней мере, это объясняет ваш завышенный подсчет.
Обратите внимание, что уже существует команда, которая делает то, что вы хотите сделать:
killall -15 Xorg
.
Вы также можете сделать kill -15 $ (pidof Xorg)
.
Для вашего сценария вы можете использовать ps aux | grep Xorg | grep -v grep | awk '{print $ 2}'
как предложено @Adionditsak или ps ax | grep Xorg | grep -v grep | awk '{print $ 1}'
(без опции 'u' в ps
).
Получить PID процесса в строке 2 ( awk '{print $ 2}'
) и установить в переменной. Тогда убей его. Что-то вроде этого?
xorg_process=$(ps aux | grep 'Xorg' | awk '{print $2}')
kill -15 $xorg_process