Когда я выполняю команду foo в консоли (т.е. tty1), вывод отправляется на консоль.

daemon foo started successfully

Когда я выполняю ту же команду в виртуальном терминале (terminator), я не вижу вывода в терминале, но вывод отправляется на syslog.

Почему это так и как я могу контролировать, куда отправляется вывод?

У меня есть сценарий запуска инициализации, который выполняет команду foo, а вывод отправляется tty1. Вместо этого я хотел бы отправить вывод в системный журнал (как если бы я запустил скрипт инициализации в виртуальном терминале, а не в консоли)

4
400 the Cat 26 Авг 2020 в 12:08
Посмотрите на источник.
 – 
Ipor Sircer
26 Авг 2020 в 12:48
Вы путаете консоль и виртуальный терминал здесь.
 – 
JdeBP
26 Авг 2020 в 14:11
@ Ipor Sircer - как вы думаете, такое поведение характерно для моего приложения, а не для всей системы?
 – 
400 the Cat
26 Авг 2020 в 15:08
Если ваш сценарий запуска запускается из стандартного сценария /etc/rc* в последней версии Unix, вывод вашего сценария будет вести себя так, как вы хотите: через syslog. Просто попробуйте reboot.
 – 
dan
31 Авг 2020 в 15:54

2 ответа

Лучший ответ

Как вы можете прочитать на справочной странице Debian для демона, это во многом зависит от того, как вы реализовали свой демон в какой системе инициализации.

  • Способ SysV (stdin/out/err подключен к /dev/null)
  • Способ "Новый стиль": (stdout/stderr направлен на systemd-journald.service)

... 10. Вместо того, чтобы использовать вызов syslog() для входа непосредственно в службу системного журнала, демон нового стиля может выбрать просто войти в стандартная ошибка через fprintf(), которая затем перенаправляется в системный журнал система инициализации ...

В этом последнем случае поведение, которое вы заметили под своим xterm, является нормальным.

То, что демон выводит через fprintf (stdout/stderr), затем находится под контролем syslog.

Следовательно, в зависимости от вашей конфигурации системного журнала (как вы найдете ее в файле syslog.conf) и в зависимости от уровня журнала, вывод вашего демона будет игнорироваться/добавляться к определенному файлу/отображаться на системной консоли (ваш tty1), и никогда не xterm.

3
Jeff Schaller 6 Сен 2020 в 16:54

Это поведение приложения, а не всей системы. rsyslog будет вызываться только тогда, когда это делает приложение, через службу ведения журналов или что-то подобное. Стандартный вывод и поток ошибок, если они не перенаправлены, отображаются на вашем экране.

0
Andrew Yu 29 Авг 2020 в 09:54
- независимо от того, зависит ли это от приложения или нет. Как я могу «обмануть» приложение, заставив его думать, что оно работает в виртуальном терминале, чтобы оно выводило свои выходные данные в системный журнал, а не на терминал?
 – 
400 the Cat
29 Авг 2020 в 10:54
Не уверен, но это может быть проблема идентификации оболочки входа в систему. Вы можете захотеть «su - <ваше собственное имя пользователя», чтобы получить что-то вроде оболочки входа в систему или ssh. Это заставляет программы думать, что это оболочка входа в систему, как я вижу с bash, который читает .bash_profile вместо только .bashrc.
 – 
Andrew Yu
30 Авг 2020 в 05:37