@Vlastimil спасибо за вашу расширенную помощь и рекомендации...
Я смог исправить ошибку, удаливgnome-themes-standard-data
sudo apt remove gnome-themes-standard-data
Это помогло, ошибка говорит, что это сломает мою версию gnome -темы -стандартные -данные , если установлена тема adwaita -icon -...
Следовательно, кпечатка была моей версией gnome-themes-standard-data
.
Выполнил обновление sudo apt update
и обновил linux mint, несмотря на ряд проблем... в итоге он обновился до Сары, а оттуда я обновился до Сони.
Да, при условии, что линии присвоен уникальный идентификатор и сконфигурированная терминальная линия доступна:
S1:12345:respawn:/sbin/getty -L 115200 ttyS1
откроет терминал на последовательном порту, подключенном к ttyS1
.
Строки в inittab
не являются последовательными и не связаны с логином. Каждая строка описывает действие, которое должно быть выполнено на заданном наборе уровней выполнения. Таким образом, si::sysinit:/etc/init.d/rcS
указывает, что init
должен запускать /etc/init.d/rcS
, когда он обрабатывает инициализацию системы; это происходит до того, как станет возможным вход в систему. (См. справочную страницу inittab(5)
для получения подробной информации ).
Чтобы назначить разные команды разным getty
s на определенных терминалах, вы должны настроить сам getty
вызов, например, изменив login
программу, которую он запускает (параметр -l
в большинстве getty
реализации):
S0:12345:respawn:/sbin/getty -L 115200 -l /bin/my-t0-login ttyS0
S1:12345:respawn:/sbin/getty -L 115200 -l /bin/my-t1-login ttyS1
/etc/init.d/rc 5
запускается до того, как становится возможным вход в систему, и программы, которые он запускает, не подключены к терминалу («правильно», что и делает getty
— он открывает для вас терминал и подключает к нему запущенные программы ), поэтому при вызове su nobody -c /bin/sh
оболочка не находит ожидаемую настройку терминала и в результате отключает управление заданиями. Приглашение sh-4.3$
— это приглашение по умолчанию в Bash 4.3 при запуске как /bin/sh
.
Если предполагается, что ваша программа запускается только после входа пользователя в систему, вы можете подключить ее к последовательности входа, используемой getty
; но такая программа будет работать как root. В зависимости от того, что вам нужно,вам, вероятно, лучше использовать сценарий инициализации, а не настройку /etc/inittab
или sudo
и сценарии запуска оболочки.
Вопрос 1:
Да, добавляя больше getty
линий, вы можете получить больше терминалов параллельно. Только один getty
может быть связан с одним оконечным устройством одновременно, поэтому возможен только один getty
на последовательный порт. На обычном настольном ПК ядро Linux определяет ряд виртуальных консолей, доступных с помощью комбинации клавиш Control + Alt + FX и соответствующих /dev/ttyX
устройства (X = число ). Точная настройка может варьироваться в зависимости от дистрибутива, но обычно в основных дистрибутивах первые 6 или около того устройств /dev/ttyX
имеют настроенные для них getty
, когда система работает нормально. Вы можете использовать команды openvt
и deallocvt
для добавления или удаления виртуальных консолей и запуска процессов (, которые могут быть любыми процессами, не обязательно getty
с )на них.
/dev/tty0
является специальным :и относится к той виртуальной консоли, которая выбрана в данный момент. /dev/console
— это аналогичное специальное устройство, указывающее на любое устройство TTY, определенное как основная системная консоль уровня ядра -. В настольных системах по умолчанию это фактически псевдоним /dev/tty0
, но с помощью параметра загрузки console=
вы можете переключить его на последовательный порт. Напр. в некоторых встроенных архитектурах это может быть последовательный порт по умолчанию. Такие утилиты, как xconsole
, также могут выступать в качестве дополнительных выходных данных для /dev/console
.
В те времена, когда компьютеры были большими много -шкафами в выделенных компьютерных залах, отправка сообщения на /dev/console
была способом связаться с -дежурным системным оператором, физически находящимся рядом с компьютером, что могло быть полезно для запросов, например меняйте ленты или пакеты дисков. В современных системах сообщения, отправляемые специально на /dev/console
, обычно являются сообщениями о загрузке/выключении,или, возможно, крайний -канал прибежища для срочных предупреждений об условиях сбоя, которые могут повлиять на доступ к сети или хранилищу или даже привести к сбою ядра :«лицо, отвечающее за физическое оборудование, должно видеть это и обычные файлы журнала непригодны для использования по какой-либо причине».
Вопрос 2:
Боюсь, здесь у вас неправильное представление. Строка sysinit
и другие строки /etc/inittab
никак не связаны с процессами getty
. Каждая команда, выполняемая из inittab
, если не указано иное, имеет свои стандартные потоки ввода, вывода и ошибок, связанные с /dev/console
.
Строки getty
фактически определяют устройство TTY, которое они будут использовать, а процесс getty
имеет встроенный код, который назначит это устройство TTY для себя и всех своих дочерних процессов, если/пока пользователь не запустит оболочку и решает перенаправить эти потоки другим способом. Это и инициализация настроек устройства TTY являются самой большой частью цели getty
:отображения /etc/issue
и приглашения для входа в систему, принятия имени пользователя, установки переменной среды TERM и запуска следующего шага входа в систему TTY. процесс (обычно /bin/login
, но настраиваемый )фактически является лишь второстепенной частью.
Обратите внимание, что существует соглашение о том, что для устройств TTY поле идентификатора из двух символов -в первом столбце строки inittab
должно соответствовать имени рассматриваемого устройства TTY после префикса /dev/tty
. поэтому /dev/ttyS0
получит идентификатор строки inittab S0
и так далее. Для вещей, которые вообще не обязательно связаны с каким-либо TTY (или просто выводят экстренные данные в /dev/console при необходимости ), ID может быть любым, который не конфликтует с идентификаторами строк устройства TTY.
(В те времена, когда терминалы, подключенные к последовательному порту -, были нормой, настройка устройства TTY правильно подходила для терминала на другом конце линии.и сброс этого терминала в известное состояние для входа в систему были -нетривиальными задачами, поскольку существовало множество конкурирующих стандартов типов терминалов.)
Если вы настроите строку inittab
для запуска скрипта, вы сможете, например, посмотреть, существует ли конкретное /dev/ttyX
виртуальное консольное устройство. Если это не так, вы можете использовать openvt -c X <command>
, чтобы создать виртуальную консоль и запустить на ней команду; если виртуальное консольное устройство уже существует, вы можете просто запустить любую команду, которую вы хотите, со стандартным вводом, выводом и ошибкой, перенаправленной на него. Например, вы можете указать такую строку inittab:
6:345:respawn:/usr/local/sbin/myscript
, а затем /usr/local/sbin/myscript
с чем-то вроде этого (заявление об отказе от ответственности :не тестировалось, у меня сейчас нет под рукой системы с SysVinit, не стесняйтесь редактировать, если вы можете улучшить это):
#!/bin/sh
if [ -c /dev/tty6 ]; then
exec <some command> </dev/tty6 >/dev/tty6 2>&1
else
exec openvt -c 6 -w <some command>
fi
respawn
в строке inittab
гарантирует, что процесс будет автоматически перезапущен, если он по какой-либо причине умрет. 345
— это список уровней выполнения SysVinit, на которых должен выполняться этот процесс. Если вам нужно, чтобы он работал на всех обычных уровнях выполнения, введите 12345
.
Обратите внимание: это работает, как задумано, только если строка inittab расположена после строки sysinit
, поэтому можно считать, что инициализация udev
завершена. Если вы хотите сделать это в начале процесса инициализации, вам, возможно, придется позаботиться о создании фактических узлов устройств для устройств, для которых драйверы уже загружены первыми; после запуска udev
он должен автоматически создавать узлы устройств по мере инициализации драйверов устройств.
При использовании последовательного порта команда openvt
не применяется.
Так что да, вы определенно можете прикреплять разные команды к разным устройствам TTY. Это помогает, если команды имеют встроенные -средства для этого, подобные getty
s, но вы можете сделать это и с помощью сценариев.
(Если вы настроили что-то более сложное, чем простой tail -f
, чтобы постоянно просматривать какой-либо журнал в другой -неиспользуемой виртуальной консоли,вы должны прочитать man setsid
и посмотреть, применимо ли это к тому, что вы планируете.)
Вопрос 3:
Инициализация сеанса TTY для конкретного пользователя, отличного от -root, — это нечто большее, чем просто запуск оболочки с su
.
Сообщения об ошибках
sh: cannot set terminal process group (1618): Inappropriate ioctl for device
sh: no job control in this shell
, вероятно, вызваны тем, что оболочка связана с устройством /dev/console
, а не с конкретным устройством TTY. Поскольку /dev/console
— это всего лишь псевдоним текущей системной консоли, он не будет иметь полного набора функций ioctl управления TTY, доступных для него.
Если нет сценария входа в систему для присвоения более полезного значения переменной среды PS1
, приглашение по умолчанию для /bin/sh
может быть просто sh-<version>$
.
Вопрос 4:
Да, можно. Вы должны указать «последний сценарий» как строку типаwait
-в inittab
и поместить ее перед строкой getty
, соответствующей вашей последовательной линии.
Не зная более подробной информации о вашей среде, будет очень трудно сказать, какой лучший способ создать пользователя с низкими -привилегиями для таких целей.
Только что секунда (долго! )ответ был опубликован. Я должен сказать, что первый объясняет довольно хорошо. На данный момент я хочу прокомментировать третий пункт :. Это вопрос не столько времени, сколько процессов, управляющих «настоящим виртуальным» tty, а не просто «пустышкой консоли».
Прежде чем вы сможете запустить оболочку «с управлением заданиями», вы должны настроить, т. е. открыть ttyN. «Общая» команда — getty
. Из этого tty -вы можете запустить оболочку, а не только после этого.
Это похоже на попытку сначала запустить оконный менеджер, а затем xorg, вместо того, чтобы «загрузить» их вместе с xinit. Я думаю. «лидер сессии».
Из-за
xx:12:...:program
и, наоборот,:
aa:1:...:pr_1
bb:1:...:pr_2
...вы получаете отношение N :M (вы также получаете беспорядок, если злоупотребляете --множеством RL, каждый из которых имеет множество разных программ ). Вы можете далеко зайти с этим, но с тех пор различные виды RC -«стандартов» взяли верх. "Ранкомс". С ними inittab выглядит просто, но вся сложность в этих скриптах.
Но ваш inittab выглядит просто и правильно -только последний комментарий и запись "z6"...
Может быть, вашему «су никто» просто нужно «гетти... ttyN» перед/вокруг. su
вместо login
и нет респауна. Должен по крайней мере дать другое сообщение об ошибке, чем "неуместно".
Заключение (после прочтения 2-го ответа ):Вам не нужна сложная init.d
система, необработанный inittab достаточно гибок.Просто нужно правильно понять концепцию и детали.
Вы можете установить три уровня выполнения :один с ttyN, один с ttySN и один RL, который запускает оба. Это параметр загрузки, который вы можете добавить с помощью загрузчика. Уровень запуска "5" в вашем случае только по умолчанию. Вы выбираете ядро, root= и уровень выполнения для инициализации.
Действие «возрождение» — это то, для чего на самом деле был нужен sysvinit. Большего он не делает, а меньшее можно было бы реализовать в скрипте. Но если вы выйдете из (или выйдете из строя )на «последнем» уровне оболочки, вам нужна подстраховка.
sysvinit может даже обнаружить неправильную конфигурацию, выдав ошибку "создание слишком быстро --игнорирование в течение 5 минут...".