Ошибка при загрузке /home/[username]/.profile

Вопрос или проблема

Когда система загружается, возникает следующая ошибка:

Ошибка при загрузке /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 примерно таков:

  1. чтение .profile (все оболочки, подобные “sh”, читают это)
  2. .profile вызывает .bashrc
  3. .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 – по крайней мере, до проверки интерактивности выше. Поэтому каждая строка кода, которая находится в этих файлах до проверки интерактивности, которая действительно предназначена для вас, когда вы печатаете в терминале, является пустой тратой времени для компьютера и может привести к появлению запутанной информации, такой как это сообщение об ошибке.

Рекомендации по лучшим практикам:

  1. Устанавливайте переменные окружения (если это действительно необходимо) выше “проверки интерактивности”
  2. В большинстве случаев оставляйте .profile без изменений (есть несколько причин, почему вы можете потребовать изменить его, но все равно придерживайтесь рекомендации 1)
  3. Переместите большую часть вашей настройки после “проверки интерактивности” – например, псевдонимы, автозаполнение, инструменты терминала (такие как 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), но не может этого сделать в текущей среде выполнения. В результате, если ваша сессия не является интерактивной, это может привести к проблемам с выполнением определенных команд и настроек, которые требуют наличия терминала.

Проанализируем вашу конфигурацию:

  1. Содержимое файла .profile:

    mesg n || true

    Ваша команда mesg n используется для настройки прав на сообщения, которые могут отображаться в терминале. Однако если команда вызывается в контексте, где нет терминала, результатом будет представленная вами ошибка.

  2. Вывод команды grep -i mesg:
    В вашем выводе видно, что mesg вызывается только в файле .profile, и в .bashrc или других файлах нет никаких упоминаний о mesg.

Решение проблемы

Чтобы исправить проблему, вы можете изменить строку в вашем файле .profile, добавив проверку на наличие терминала перед вызовом mesg. Это можно сделать следующим образом:

  1. Откройте файл .profile в текстовом редакторе:

    gedit .profile
  2. Измените строку:

    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
  • Оптимизация производительности: Переместите части конфигураций, требующие терминала, после проверок интерактивной среды, чтобы избежать ненужных задержек и ошибок, когда ваша среда выполнения не предполагает взаимодействия с пользователем.

Следуя этим рекомендациям, вы сможете избежать возникновения подобных проблем в будущем, а также оптимизировать взаимодействие вашей системы с пользователем.

Оцените материал
Добавить комментарий

Капча загружается...