На сервере стандартный поток ошибок (stderr) после выполнения любой команды перенаправляется в /dev/null — как это исправить?

Очень странная проблема. <br/> На TrueNAS SCALE после выполнения любой команды дескриптор stderr перенаправляется в /dev/null. <br/> <br/> Ниже видно подтверждение: <br/> <pre><code class="bash">truenas_admin•~» ls -l /proc/self/fd/                                                                                                   [19:26:48]
  • 10 апреля 2026 г. 20:01
Ответы на вопрос 3
Коротко — причина в том, что процесс-предок вашей сессии открыл fd 2 в /dev/null (либо shell в каких‑то файл‑скриптах сделал `exec 2>/dev/null`, либо systemd запустил службу с `StandardError=null`). Надо найти этот процесс и устранить место, где перенаправление делается, либо изменить unit systemd.

Диагностика (выполните в проблемной сессии):

1) Убедиться, куда сейчас указывает stderr:
   readlink /proc/$$/fd/2

2) Проследить цепочку предков и найти, на каком уровне stderr становится /dev/null:
   p=$$
   while [ "$p" -ne 1 ]; do
     echo "PID $p: $(ps -p $p -o cmd=)"
     readlink -f /proc/$p/fd/2 2>/dev/null || echo "no fd2"
     p=$(ps -p $p -o ppid=)
   done

Когда увидите PID, у которого fd/2 == /dev/null, посмотрите, что это за процесс:
   ps -p <PID> -o pid,ppid,cmd
и где он был запущен (если systemd):
   cat /proc/<PID>/cgroup
   # или
   systemctl status <имя_сервиса>   # если знаете сервис

3) Поиск по конфигам на `exec 2>/dev/null` или аналог:
   grep -R --line-number "exec .*2>/dev/null" /etc /root /home 2>/dev/null

Возможные исправления

A) Если это shell‑скрипт (в /etc/profile, /etc/profile.d/*, ~/.bashrc и т.п.) делает exec 2>/dev/null — удалить или изменить эту строку.

B) Если предок — systemd‑сервис, у него в unit указано StandardError=null. Исправить можно через override:
   systemctl edit <unit>.service
в появившемся редакторе добавить:
   [Service]
   StandardOutput=inherit
   StandardError=inherit
сохранить, затем:
   systemctl daemon-reload
   systemctl restart <unit>.service

(вместо inherit можно выбрать journal/tty в зависимости от требуемого поведения; по умолчанию systemd пишет в журнал).

Временное (незавершающееся) исправление для текущей сессии

Если нужно просто вернуть stderr в текущей сессии на терминал:
   exec 2>/dev/tty
или (если stdout уже нормален)
   exec 2>&1

Проверка
   echo "msg on stderr" >&2

Если после этих действий проблема остаётся — пришлите вывод:
- readlink /proc/$$/fd/2
- вывод цикла предков (команда из п.2)
- результат grep по конфигам

С этими данными я подскажу точнее, где именно править.
Как вариант, для начала проверить настройки профиля <br/> ~/.bash_profile <br/> ~/.bashrc <br/> ~/.profile <br/> возможно какой то добавленный скрипт или значение переменной изменяют  нормальный ход работы.
это p10k instant prompt, он exec'ом перенаправляет stderr в precmd и если что-то конфликтует, не восстанавливает обратно. Выключи: <code>typeset -g POWERLEVEL9K_INSTANT_PROMPT=off</code> в ~/.p10k.zsh, перезайди. Если вдруг p10k не при чём — <code>zsh -f</code> покажет воспроизводится ли без конфигов.
Похожие вопросы