Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Операционные системы » UNIX » Запуск команды во время загрузки по нажатию определенной кла

Модерирует : ShriEkeR

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

zaum

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Добрый день!
Собираю специализированный дистрибутив. Встала такая задача. Во время загрузке необходимо чтобы при нажатии определенной клавиши на клавиатуре (например Del) загрузка прерывалась и запускалась определенная программа (в моем случае настройка параметров и дальнейшая загрузка).
В древнем Red Hat такое было точно и после запуска init была надпись, что то типа «Press I for interactive load». Как можно такое реализовать или делают обычно?

Всего записей: 44 | Зарегистр. 04-12-2008 | Отправлено: 13:13 16-05-2015
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
zaum
Ну можно допихать в initrd своё интерактивное поделие, например на bash'е.

----------
Microsoft gives you windows, linuх gives you the whole house...
I've been using Vim for about 4 years now, mostly because I can't figure out how to exit it.

Всего записей: 6562 | Зарегистр. 28-08-2008 | Отправлено: 16:00 19-05-2015
zaum

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Да проблема не в том куда свое поделие запихать, а в том как сделать так чтобы оно запускалось по нажатию клавиши. А вариантов оказывается немного и идеального нет.

Всего записей: 44 | Зарегистр. 04-12-2008 | Отправлено: 01:32 22-05-2015
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
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
У данного примера есть один изъян, если быстро нажимать не ту клавишу, то каждое такое нажатие будет скрадывать одну секунду от таймера. В остальном тут всё ок.

----------
Microsoft gives you windows, linuх gives you the whole house...
I've been using Vim for about 4 years now, mostly because I can't figure out how to exit it.

Всего записей: 6562 | Зарегистр. 28-08-2008 | Отправлено: 11:50 22-05-2015
zaum

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Тат задача не в том что бы на паузу загрузку ставить. Так то понятно что хоть на баше, хоть на Си (даже лучше) программу написать. 10 сек паузы это долго.  
Смысл в том что бы обрабатывать нажатие комбинации клавиш в то время как идет загрузка остального не прерывая ее. И тут только нарылось kbrequest в inittab, но он там похоже завязан как то на kbd и мне пока с ходу не удалось заставить это заработать.

Всего записей: 44 | Зарегистр. 04-12-2008 | Отправлено: 14:08 22-05-2015
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
zaum
эм, ну без паузы будет очень тяжело успеть что-то нажать, на современных машинах загрузка весьма быстро проскакивает...
Ок, тогда ещё уточнение... Вы тут про inittab заговорили, значит программа Ваша должна запускаться уже в рамках ОС или всё же до ОС, на этапе загрузки ядра и распаковки initrd, если таковой имеется?

----------
Microsoft gives you windows, linuх gives you the whole house...
I've been using Vim for about 4 years now, mostly because I can't figure out how to exit it.

Всего записей: 6562 | Зарегистр. 28-08-2008 | Отправлено: 14:23 22-05-2015
zaum

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Сейчас я подробнее объясню, что мне нужно.
 
Я хочу сделать модификацию дистрибутива 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 и является корневой фс.

Всего записей: 44 | Зарегистр. 04-12-2008 | Отправлено: 15:45 22-05-2015
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
zaum
Ну в общем-то понятно.
 
Касательно inittab'а взгляните на этот ответ.
 
А мне стало интересно, так что как освобожусь от работы, попробую написать прогу, которая сама будет выполнять аналогичный функционал.

----------
Microsoft gives you windows, linuх gives you the whole house...
I've been using Vim for about 4 years now, mostly because I can't figure out how to exit it.

Всего записей: 6562 | Зарегистр. 28-08-2008 | Отправлено: 16:09 22-05-2015
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
zaum
Как успехи?
 
Я, как и собирался, наваял небольшое поделие, которое обладает почти всем нужным функционалом.
Есть один не решённый вопрос. Вызываемая программа запускается в том же контексте что и моя программа, так что как из обычного демона вызвать GUI программу на нужном рабочем столе я хз.
Однако указанный бинарник успешно вызывается и если он сам сможет запуститься или выполнить какие-то действия, например это bash скрипт с sed командами, то значит он это сделает.
Также стоит помнить что запускается это всё это root'а. Моей программе он необходим что бы читать нажатые клавиши.

----------
Microsoft gives you windows, linuх gives you the whole house...
I've been using Vim for about 4 years now, mostly because I can't figure out how to exit it.

Всего записей: 6562 | Зарегистр. 28-08-2008 | Отправлено: 22:54 23-05-2015
L_S_V



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
если еще актуально, то можно сделать splash на ncurses и загружать его в initrd как шел.
т.е. на экране будет внизу строка с надписью: нажмите ctrl+f для конфигурационного меню.
и ncurses будет отображать выше ход зарузки и автоматом ловить в wgetch() нажатие клавиши.

Всего записей: 627 | Зарегистр. 31-03-2005 | Отправлено: 04:43 17-06-2015
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
L_S_V
как вариант, НО imho, этап initrd слишком короткий.

----------
Microsoft gives you windows, linuх gives you the whole house...
I've been using Vim for about 4 years now, mostly because I can't figure out how to exit it.

Всего записей: 6562 | Зарегистр. 28-08-2008 | Отправлено: 10:47 17-06-2015
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Операционные системы » UNIX » Запуск команды во время загрузки по нажатию определенной кла


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru