Вопрос или проблема
Когда система загружается, возникает следующая ошибка:
Ошибка при загрузке /home/[username]/.profile
mesg: ttyname не удалось: неподходящий ioctl для устройства
В результате сессия может быть настроена неправильно
Вы должны исправить проблему как можно скорее
Вывод команды grep -i mesg
для .profile
и .bash*
следующий:
$ grep -i mesg .profile
mesg n || true
$ grep -i mesg .bash*
$
В терминале
…
gedit .profile
измените это:
mesg n || true
на это:
tty -s && mesg n || true
Файл .profile для учетной записи root может потребовать аналогичного (но слегка отличающегося) исправления.
stty -ixon
в .profile
Команда была в моем .profile
, и она вызывала проблему в Ubuntu 17.10.
Я добавил её, основываясь на рекомендациях по этому вопросу: https://unix.stackexchange.com/questions/12107/how-to-unfreeze-after-accidentally-pressing-ctrl-s-in-a-terminal
Чтобы уточнить принятое решение, ваши скрипты инициализации оболочки .profile
и .bashrc
(при условии, что вы используете bash – в противном случае каждая оболочка различна) выполняются в ряде различных сценариев:
- интерактивный вход – например
- если вы входите через ssh
- запуск графического терминала (эмуляторы терминала различаются по тому, когда они начинают новую сессию – или могут быть настроены)
- когда скрипт выполняется от вашего имени
- автоматические задачи (например, cron)
- просто обычный shell-скрипт
- более старые примеры, которые встречаются реже, включают файлы запуска, такие как
.xinitrc
и.Xsession
при входе (только X) - неинтерактивный ssh – например
ssh host ls
Главное важное отличие – это то, является ли сессия оболочки “интерактивной” сессией на “терминале” (также известном как tty) или нет. Интерактивная сессия предполагает, что человек вводит команды в оболочку и имеет терминал (например, для отображения цветов на экране или рисования индикаторов выполнения или аналогичной “терминальной графики”).
При запуске скриптов или задач cron оболочка работает как неинтерактивная оболочка и не ожидает наличия терминала/tty. Многие программы определяют, есть ли у них терминал/tty, и корректируют свое поведение (например, не запрашивая у пользователя ввод), но не все из них. Использование программ, требующих терминала/tty, когда его нет, может привести к странному поведению – сбоям, зависаниям в ожидании ввода от пользователя и т. д.,…
В Ubuntu поток запуска bash примерно таков:
- чтение
.profile
(все оболочки, подобные “sh”, читают это) .profile
вызывает.bashrc
.bashrc
в конечном итоге содержит следующие строки:# Если не работает в интерактивном режиме, ничего не делать case $- in *i*) ;; *) return;; esac
Этот case
в вашем bashrc останавливает парсинг .bashrc
, если вы не работаете в интерактивном режиме.
Поэтому лучшее решение – поместить любую конфигурацию, требующую tty, после этой части вашего .bashrc
mesg n || true
Принятый ответ имеет альтернативный обходной путь, используя tty -s
для определения, присутствует ли терминал (предполагая, что это означает интерактивную сессию) – таким образом, tty -s && mesg n
выполняет mesg n
только в том случае, если tty -s
успешно.
На современных системах это различие может быть не столь важным, но помните, что каждый скрипт оболочки (ну, каждый sh
скрипт) в вашей системе запускает ваш .profile
и каждый bash-скрипт запускает .bashrc
– по крайней мере, до проверки интерактивности выше. Поэтому каждая строка кода, которая находится в этих файлах до проверки интерактивности, которая действительно предназначена для вас, когда вы печатаете в терминале, является пустой тратой времени для компьютера и может привести к появлению запутанной информации, такой как это сообщение об ошибке.
Рекомендации по лучшим практикам:
- Устанавливайте переменные окружения (если это действительно необходимо) выше “проверки интерактивности”
- В большинстве случаев оставляйте
.profile
без изменений (есть несколько причин, почему вы можете потребовать изменить его, но все равно придерживайтесь рекомендации 1) - Переместите большую часть вашей настройки после “проверки интерактивности” – например, псевдонимы, автозаполнение, инструменты терминала (такие как
mesg
,biff
и т. д.), ssh-агенты,…
Это означает, что скрипты будут выполняться быстрее, и вам не понадобятся обходные пути для ваших интерактивных инструментов.
В системах cPanel в /etc/bashrc вы можете найти строку:
mesg y
Замените ее на:
if [ -t 1 ]; then
mesg n
fi
И это предотвратит предупреждение
Ответ или решение
При загрузке системы вы получаете ошибку, связанную с загрузкой файла /home/[username]/.profile
, которая звучит следующим образом:
Ошибка при загрузке /home/[username]/.profile
mesg: ttyname failed: inappropriate ioctl for device
В результате сессия настроена неправильно
Необходимо устранить проблему как можно скорее
Причины возникновения ошибки
Ошибка mesg: ttyname failed: inappropriate ioctl for device
обычно происходит из-за того, что команда mesg
пытается проверить, есть ли доступный терминал (tty), но не может этого сделать в текущей среде выполнения. В результате, если ваша сессия не является интерактивной, это может привести к проблемам с выполнением определенных команд и настроек, которые требуют наличия терминала.
Проанализируем вашу конфигурацию:
-
Содержимое файла
.profile
:mesg n || true
Ваша команда
mesg n
используется для настройки прав на сообщения, которые могут отображаться в терминале. Однако если команда вызывается в контексте, где нет терминала, результатом будет представленная вами ошибка. -
Вывод команды
grep -i mesg
:
В вашем выводе видно, чтоmesg
вызывается только в файле.profile
, и в.bashrc
или других файлах нет никаких упоминаний оmesg
.
Решение проблемы
Чтобы исправить проблему, вы можете изменить строку в вашем файле .profile
, добавив проверку на наличие терминала перед вызовом mesg
. Это можно сделать следующим образом:
-
Откройте файл
.profile
в текстовом редакторе:gedit .profile
-
Измените строку:
mesg n || true
на:
tty -s && mesg n || true
Таким образом, команда mesg n
будет выполняться только в том случае, если в текущей среде выполнения есть доступный терминал (tty).
Другие возможные проблемы
Кроме того, есть вероятность, что в вашем файле .profile
может быть другая команда, которая вызывает ошибку. Например, наличие команды stty -ixon
также может создавать проблемы, если она вызывается в неинтерактивных сессиях, как это было замечено в Ubuntu 17.10. Рекомендуется удалить или закомментировать такую команду, если она не необходима.
Общие рекомендации
-
Структурируйте настройки: Чтобы избежать подобных ошибок, структура ваших конфигурационных файлов имеет большое значение. Необходимо отделять команды, которые зависят от интерактивных сессий, и те, которые могут выполняться в автоматизированных сценариях (например, в
cron
). -
Проверки окружения: Используйте конструкции, подобные
if [ -t 1 ]; then
, чтобы проверить наличие терминала перед выполнением команд, которые его требуют. Например:if [ -t 1 ]; then mesg n fi
-
Оптимизация производительности: Переместите части конфигураций, требующие терминала, после проверок интерактивной среды, чтобы избежать ненужных задержек и ошибок, когда ваша среда выполнения не предполагает взаимодействия с пользователем.
Следуя этим рекомендациям, вы сможете избежать возникновения подобных проблем в будущем, а также оптимизировать взаимодействие вашей системы с пользователем.