Могу ли я получить доступ к файлу терминала?

К сожалению, вы не можете. С type=simple systemd отслеживает процесс, непосредственно выполняемый параметром ExecStart. Хотя type=forking по-прежнему будет иметь аналогичную проблему, в этом случае systemd будет отслеживать процесс, и как только он завершится, systemd подумает, что он мертв.

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

Есть 2 способа решить эту проблему:

  1. Каким-то образом создайте процесс монитора, который выполняет systemd, и этот процесс запускает ваше приложение. Затем каким-то образом этот процесс монитора сможет определить разницу между выходом приложения и fork-exit. Это может быть довольно сложно реализовать, так как нелегко отслеживать дочерние процессы дочерних процессов.
    Один из способов, который может сработать, — создать анонимный канал, передать конец канала для записи процессу и дождаться EOF на его конце для чтения. Пока ваше приложение не закрывает неизвестные файловые дескрипторы, оно должно работать.
  2. Измените приложение, чтобы оно использовало exec вместо fork+exec. Таким образом, новый процесс использует тот же PID, что и старый процесс.
0
09.04.2017, 01:55
4 ответа

В 1970-х годах у нас были аппаратные терминалы CUI.

Однако никто не использовал термин CUI в 70-х годах.

Теперь в моем Linux-боксе я вижу семь эмуляторов терминала, где графический интерфейс занимает седьмой эмулятор терминала (Ctrl + Alt + F7).

Эти эмуляторы терминала были доступны уже в 80-х, и графического интерфейса пользователя не существовало.

Используя какой-нибудь редактор, доступен ли этот файл терминала / dev / tty0 в пользовательском пространстве?

Этот вопрос не имеет смысла. Все файлы доступны в пользовательском пространстве по дизайну, в этом вся суть файлов, особенно в / dev . / dev / tty0 будучи устройством, его нельзя редактировать, так как его «содержимое» по сути эфемерно. То, что вы читаете, - это то, что вы в конечном итоге вводите в консоль, и то, что вы пишете на ней, отображается на экране.

2
28.01.2020, 02:13

Да, вы, безусловно, можете получить доступ к любому телетайпу в виде файла, как и к любому устройству в unix. Я бы отметил этот вопрос как потенциально повторяющийся, поскольку этот ответ хорошо объясняет, как делать то, что вы просите, в аналогичной ситуации.

Подводя итог тому, что говорится в этом ответе, вы можете взаимодействовать с другими TTY, используя echo и cat, как и с любым другим файлом. Причина, по которой вы ничего не видите при открытии файла, заключается в том, что, как и во многих специальных файлах, доступны только новые данные.

1
28.01.2020, 02:13

Вы постоянно обращаетесь к файлу терминала. Но это не делает то, что вы, вероятно, думаете.

Когда вы записываете в файл на диске, а затем читаете из него, вы читаете то, что написали. Это не относится к специальным файлам, таким как терминалы. Файл - это то, что можно писать и читать из¹; связь между тем, что записывается, и тем, что читается, зависит от природы файла. С файлом символьного устройства обычно нет ссылки.

Файлы терминала соединяют два объекта, которые играют разные роли: сам терминал и приложение, которое хочет взаимодействовать с пользователем. Терминал может быть частью оборудования, представленным ядром, или эмулятором терминала, который представляет собой процесс. Когда приложение записывает данные, терминал их читает (и обычно каким-то образом отображает их пользователю); когда приложение считывает данные, данные поступают с терминала (обычно это вводится пользователем).

В вашем случае приложение последовательно является оболочкой, котом, редактором и т. Д. Редактор может пытаться читать с терминала, но в этом случае он ожидает вашего ввода и может или не может правильно реагировать на конец ввода (о котором вы должны сигнализировать, нажав Ctrl + D в начале строки). Еще раз, чтение с терминала не даст вам вещей, которые были выведены на терминал.

В случае консоли данные, которые записываются в терминал, отображаются на экране.На консолях Linux текст, отображаемый на / dev / tty1 , может быть прочитан с устройства / dev / vcs1 до тех пор, пока он остается отображаемым (так что вы получаете только то, что отображается на экран, плюс то, что по-прежнему доступно при прокрутке назад; все, что недоступно при прокрутке назад, теряется навсегда).

Обратите внимание, что это средство, предлагаемое терминальным интерфейсом Linux. Терминал мог просто нарисовать пиксели и забыть текст. Большинство эмуляторов терминала не предоставляют подобных возможностей.

¹ На самом деле большинство файлов такие, но не все. Каталоги не могут быть записаны через обычный интерфейс, и во многих вариантах unix также не могут быть прочитаны. Некоторые устройства не поддерживают чтение и запись, только ioctl .

5
28.01.2020, 02:13

Да, однако файл терминала не является обычным файлом.

Если вы перечислите расширенные свойства терминального файла, вы увидите:

$ ls /dev/tty1 -lah
crw--w---- 1 root tty 4, 0 Apr  6 13:07 /dev/tty1

обратите внимание, что первый символ в разделе разрешений — это буква «c», это указывает на то, что файл является символьным специальным устройством. Напротив, обычный файл будет иметь там «-», каталог «d», специальное блочное устройство «b», символическую ссылку «l» и сокет домена unix «s».

Важно отметить, что в системах Unix, таких как Linux, файловая система на самом деле больше похожа на пространство имен для взаимодействия с объектами ядра, где вы можете давать имена различным объектам ядра, чтобы на них можно было однозначно ссылаться в различных частях системы. Эти объекты ядра представляют собой не только обычные файлы, поддерживаемые постоянным хранилищем, но и такие вещи, как аппаратное устройство, сокеты и т. д.

Символьное специальное устройство — это объект ядра, который взаимодействует с пользовательским пространством путем чтения и записи потоков символов. , к ним можно получить доступ, выполнив системные вызовы read() и write() .

Например, на моей машине с помощью Ctrl+Alt+F1 (то есть /dev/tty1 на моей машине, а не tty0) я мог считывать все, что набирается, на виртуальную консоль с помощью программы, использующей read() системный вызов типа cat:

  1. В графическом эмуляторе sudo cat /dev/tty1
  2. Переключиться на эмулятор виртуальной консоли с помощью Ctrl+Alt+F1
  3. Тип что-нибудь в эмулятор виртуальной консоли
  4. Вернитесь к графическому интерфейсу с помощью Ctrl+Alt+F7
  5. В графическом эмуляторе я увижу все, что набрал в эмуляторе виртуальной консоли, как результат cat

Наоборот, я мог бы также отображать символы в виртуальной консоли, используя программу, которая использует системный вызов write(), например tee:

  1. В графическом эмуляторе echo "привет мир" | sudo tee /dev/tty1
  2. Переключитесь на эмулятор виртуальной консоли с помощью Ctrl+Alt+F1
  3. В эмуляторе виртуальной консоли я увижу «hello world»

Большинство обычных текстовых редакторов откажутся открывать -обычные специальные файлы, потому что они запрограммированы на проверку типа файла и отказываются редактировать нестандартные файлы. Это сделано для предотвращения "случайностей", потому что нет большого смысла редактировать специальные устройства в обычных текстовых редакторах. Кроме того, большинство обычных текстовых редакторов на самом деле не просто вызывают write() для существующего файла, а вместо этого записывают в новый файл и переименовывают() файл подкачки. заменить старый файл.Даже если у вас есть текстовый редактор, который поддерживает запись на месте, они обычно пытаются сначала обрезать файл, что, конечно, не поддерживается в устройстве со специальными символами.

3
28.01.2020, 02:13

Теги

Похожие вопросы