Ru-Board.club
← Вернуться в раздел «UNIX»

» Запуск команды во время загрузки по нажатию определенной кла

Автор: zaum
Дата сообщения: 16.05.2015 13:13
Добрый день!
Собираю специализированный дистрибутив. Встала такая задача. Во время загрузке необходимо чтобы при нажатии определенной клавиши на клавиатуре (например Del) загрузка прерывалась и запускалась определенная программа (в моем случае настройка параметров и дальнейшая загрузка).
В древнем Red Hat такое было точно и после запуска init была надпись, что то типа «Press I for interactive load». Как можно такое реализовать или делают обычно?
Автор: Alukardd
Дата сообщения: 19.05.2015 16:00
zaum
Ну можно допихать в initrd своё интерактивное поделие, например на bash'е.
Автор: zaum
Дата сообщения: 22.05.2015 01:32
Да проблема не в том куда свое поделие запихать, а в том как сделать так чтобы оно запускалось по нажатию клавиши. А вариантов оказывается немного и идеального нет.
Автор: Alukardd
Дата сообщения: 22.05.2015 11:50
zaum
Если программировать не умеете, то конечно вариантов нету. Только головой ап стену бица...

Накидал Вам пример на bash'е.
x=""; timer=0; timeout=10; echo "Enter \"c\" to get message"; while [[ $timer -lt $timeout ]]; do read -srt 1 -n 1 x; [[ "x${x}" == "xc" ]] && break; ((timer++)); done; [[ "x$x" == "xc" ]] && echo OK
У данного примера есть один изъян, если быстро нажимать не ту клавишу, то каждое такое нажатие будет скрадывать одну секунду от таймера. В остальном тут всё ок.
Автор: zaum
Дата сообщения: 22.05.2015 14:08
Тат задача не в том что бы на паузу загрузку ставить. Так то понятно что хоть на баше, хоть на Си (даже лучше) программу написать. 10 сек паузы это долго.
Смысл в том что бы обрабатывать нажатие комбинации клавиш в то время как идет загрузка остального не прерывая ее. И тут только нарылось kbrequest в inittab, но он там похоже завязан как то на kbd и мне пока с ходу не удалось заставить это заработать.
Автор: Alukardd
Дата сообщения: 22.05.2015 14:23
zaum
эм, ну без паузы будет очень тяжело успеть что-то нажать, на современных машинах загрузка весьма быстро проскакивает...
Ок, тогда ещё уточнение... Вы тут про inittab заговорили, значит программа Ваша должна запускаться уже в рамках ОС или всё же до ОС, на этапе загрузки ядра и распаковки initrd, если таковой имеется?
Автор: zaum
Дата сообщения: 22.05.2015 15:45
Сейчас я подробнее объясню, что мне нужно.

Я хочу сделать модификацию дистрибутива thinstation. Если не сталкивались это мини дистрибутив для терминальных систем. (Подробнее thinstation.org). То есть он запускается, может по сети, может с локальных носителей. Потом считывает конфигурационные файлы из сети или с носителя где указаны параметры подключения (адрес сервера и тд) ну и другие параметры настройки терминала, запускает иксы и rdesktop.
Соответсвенно конфигурационные файлы надо править вручную, что для обычного пользователя обременительно.

Я хочу сделать законченный продукт для обычных пусть и продвинутых пользователей. Когда идет запуск системы (по сути не важно на каком этапе) и пользователь нажимает определенную комбинацию клавиш то в конце загрузки запускался бы мастер конфигурации. Человек меняет настройки выбирает нужные ему галочки и параметры, а мастер уже сам правит конфиги.

Это лирическое отступление. А по сути мне надо следущее. При запуске системы при нажатии определенной комбинации клавиш запускался либо определенный скрипт, либо init переходил на нужный runlevel (а там уже запускалось бы все что угодно и нужно).

Гугление и опрос на других форумах выявил в inittab следущую фичу

Например
kb::kbrequest:/bin/echo "Keyboard Request--edit /etc/inittab to let this work."

kbrequest (ядро посылает SIGWINCH при нажатии определённой комбинации клавиш)

kbrequest
The process will be executed when init receives a signal from the keyboard handler that a special key combination was pressed on the console keyboard.

The documentation for this function is not complete yet; more documentation can be found in the kbd-x.xx packages (most recent was kbd-0.94 at the time of this writing). Basically you want to map some keyboard combination to the "KeyboardSignal" action. For example, to map Alt-Uparrow for this purpose use the following in your keymaps file:

alt keycode 103 = KeyboardSignal

Но как правильно пользоваться я если чесно не понял к сожелению.

Добавлено:

Цитата:
Вы тут про inittab заговорили, значит программа Ваша должна запускаться уже в рамках ОС или всё же до ОС, на этапе загрузки ядра и распаковки initrd, если таковой имеется?

Да нажатие клавиш должно ловиться после запуска ядра, пока человек видит splash загрузочный. Ну можно и до, но я думаю без модуля ядра наврятли такое получится.
Да ОС состоит из ядра и initrd, которое и распаковывается в ramdisk и является корневой фс.
Автор: Alukardd
Дата сообщения: 22.05.2015 16:09
zaum
Ну в общем-то понятно.

Касательно inittab'а взгляните на этот ответ.

А мне стало интересно, так что как освобожусь от работы, попробую написать прогу, которая сама будет выполнять аналогичный функционал.
Автор: Alukardd
Дата сообщения: 23.05.2015 22:54
zaum
Как успехи?

Я, как и собирался, наваял небольшое поделие, которое обладает почти всем нужным функционалом.
Есть один не решённый вопрос. Вызываемая программа запускается в том же контексте что и моя программа, так что как из обычного демона вызвать GUI программу на нужном рабочем столе я хз.
Однако указанный бинарник успешно вызывается и если он сам сможет запуститься или выполнить какие-то действия, например это bash скрипт с sed командами, то значит он это сделает.
Также стоит помнить что запускается это всё это root'а. Моей программе он необходим что бы читать нажатые клавиши.
Автор: L_S_V
Дата сообщения: 17.06.2015 04:43
если еще актуально, то можно сделать splash на ncurses и загружать его в initrd как шел.
т.е. на экране будет внизу строка с надписью: нажмите ctrl+f для конфигурационного меню.
и ncurses будет отображать выше ход зарузки и автоматом ловить в wgetch() нажатие клавиши.
Автор: Alukardd
Дата сообщения: 17.06.2015 10:47
L_S_V
как вариант, НО imho, этап initrd слишком короткий.

Страницы: 1

Предыдущая тема: Разрешение монитора 4K на Ubuntu


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.