Предыстория:
Иногда с серверами случается что-то непонятное и приходится заходить смотреть, что же это такое.
При большой загрузке сервера сделать это проблематично. Я столкнулся с ситуацией, когда sshd ещё работал,
но вот даже простые команды вроде w выполнялись очень долго, а ps uax так и не отработал за ночь с nice -19
И захотелось мне сделать консоль, да с приоритетом побольше, чтобы при большой нагрузке(20-50) можно было
что-то сотворить с сервером и сбить температуру :)
Искать чужих решений я не пробовал, а сразу начал копать в сторону приоритетов. nice явно было не то что может
"спасти отца русской демократии". Вспомнил я про cdrecord, который при записи диска не от рута ругался,
что не может себе поднять приоритет и выставить какой-то RR шедулер. Натравив strace на cdrecord, я узнал о существовании
функций sched_setscheduler и sched_get_priority_max. Ну а дальше - дело техники. Каких-то байт кода
Действуем для удалённой консоли(всё от рута)
- компилируем rexec
gcc -O3 ./rexec.c -o rexec
- копируем в /bin (необязательно)
cp ./rexec /bin
- изменяем права на 755 и владельца с группой на root
chmod 755 /bin/rexec
chown root:root /bin/rexec
- добавляем пользователя toor с реальным паролем
useradd toor
passwd toor
- добавляем в конце файла /home/toor/.bash_profile строчку
exec sudo /bin/rexec
- добавляем пользователя toor в /etc/sudoers с правами аналогичными root
visudo
toor ALL=(ALL) ALL
- Всё
Как вариант без заведения доп. пользователя: вписать себя в /etc/sudoers и после логина по ssh запускать
exec sudo /bin/rexec
Как это должно работать:
При логине по ссх пользователя toor sshd запустит bash, bash запустит вместо себя sudo,
который после успешной аутентификации вместо себя запустит /bin/rexec от рута.
rexec в свою очередь переведёт себя и парента(sshd) в другой класс планировщика времени CPU
и поднимет приоритет себе через nice. Затем rexec вместо себя запускает /bin/bash с правильным окружением.
Приоритет и класс планировщика наследуются от парента к чайлду.
Действуем для локальной консоли #1(всё от рута)
- редактируем /etc/inittab:
правим строчку1:2345:respawn:/sbin/mingetty tty1
на строчку 1:2345:respawn:/bin/rexec /sbin/mingetty tty1
- telinit q
- Всё
Общее замечание - необходимо указывать полный путь запускаемого файла.
Получили:
очень высокоприоритетную консоль - выше кажется некуда ;)
ps: для того чтобы посмотреть загрузку системы не выходя из bash и не запуская ненужных процессов, попробуйте read </proc/loadavg;echo $REPLY