К сожалению, вы не можете. С type=simple
systemd отслеживает процесс, непосредственно выполняемый параметром ExecStart
. Хотя type=forking
по-прежнему будет иметь аналогичную проблему, в этом случае systemd будет отслеживать процесс, и как только он завершится, systemd подумает, что он мертв.
Сложность в том, что systemd не может знать, что это нормальное поведение вашего приложения. Возможно, ваше приложение имеет главный процесс, а затем порождает дочерние рабочие процессы. И поэтому systemd будет думать, что ваш мастер умер, и остались некоторые дети, которые нужно очистить.
Есть 2 способа решить эту проблему:
exec
вместо fork
+exec
. Таким образом, новый процесс использует тот же PID, что и старый процесс. В 1970-х годах у нас были аппаратные терминалы CUI.
Однако никто не использовал термин CUI в 70-х годах.
Теперь в моем Linux-боксе я вижу семь эмуляторов терминала, где графический интерфейс занимает седьмой эмулятор терминала (Ctrl + Alt + F7).
Эти эмуляторы терминала были доступны уже в 80-х, и графического интерфейса пользователя не существовало.
Используя какой-нибудь редактор, доступен ли этот файл терминала / dev / tty0 в пользовательском пространстве?
Этот вопрос не имеет смысла. Все файлы доступны в пользовательском пространстве по дизайну, в этом вся суть файлов, особенно в / dev
. / dev / tty0
будучи устройством, его нельзя редактировать, так как его «содержимое» по сути эфемерно. То, что вы читаете, - это то, что вы в конечном итоге вводите в консоль, и то, что вы пишете на ней, отображается на экране.
Да, вы, безусловно, можете получить доступ к любому телетайпу в виде файла, как и к любому устройству в unix. Я бы отметил этот вопрос как потенциально повторяющийся, поскольку этот ответ хорошо объясняет, как делать то, что вы просите, в аналогичной ситуации.
Подводя итог тому, что говорится в этом ответе, вы можете взаимодействовать с другими TTY, используя echo и cat, как и с любым другим файлом. Причина, по которой вы ничего не видите при открытии файла, заключается в том, что, как и во многих специальных файлах, доступны только новые данные.
Вы постоянно обращаетесь к файлу терминала. Но это не делает то, что вы, вероятно, думаете.
Когда вы записываете в файл на диске, а затем читаете из него, вы читаете то, что написали. Это не относится к специальным файлам, таким как терминалы. Файл - это то, что можно писать и читать из¹; связь между тем, что записывается, и тем, что читается, зависит от природы файла. С файлом символьного устройства обычно нет ссылки.
Файлы терминала соединяют два объекта, которые играют разные роли: сам терминал и приложение, которое хочет взаимодействовать с пользователем. Терминал может быть частью оборудования, представленным ядром, или эмулятором терминала, который представляет собой процесс. Когда приложение записывает данные, терминал их читает (и обычно каким-то образом отображает их пользователю); когда приложение считывает данные, данные поступают с терминала (обычно это вводится пользователем).
В вашем случае приложение последовательно является оболочкой, котом, редактором и т. Д. Редактор может пытаться читать с терминала, но в этом случае он ожидает вашего ввода и может или не может правильно реагировать на конец ввода (о котором вы должны сигнализировать, нажав Ctrl + D в начале строки). Еще раз, чтение с терминала не даст вам вещей, которые были выведены на терминал.
В случае консоли данные, которые записываются в терминал, отображаются на экране.На консолях Linux текст, отображаемый на / dev / tty1
, может быть прочитан с устройства / dev / vcs1
до тех пор, пока он остается отображаемым (так что вы получаете только то, что отображается на экран, плюс то, что по-прежнему доступно при прокрутке назад; все, что недоступно при прокрутке назад, теряется навсегда).
Обратите внимание, что это средство, предлагаемое терминальным интерфейсом Linux. Терминал мог просто нарисовать пиксели и забыть текст. Большинство эмуляторов терминала не предоставляют подобных возможностей.
¹ На самом деле большинство файлов такие, но не все. Каталоги не могут быть записаны через обычный интерфейс, и во многих вариантах unix также не могут быть прочитаны. Некоторые устройства не поддерживают чтение и запись, только ioctl
.
Да, однако файл терминала не является обычным файлом.
Если вы перечислите расширенные свойства терминального файла, вы увидите:
$ 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
:
sudo cat /dev/tty1
cat
Наоборот, я мог бы также отображать символы в виртуальной консоли, используя программу, которая использует системный вызов write()
, например tee
:
echo "привет мир" | sudo tee /dev/tty1
Большинство обычных текстовых редакторов откажутся открывать -обычные специальные файлы, потому что они запрограммированы на проверку типа файла и отказываются редактировать нестандартные файлы. Это сделано для предотвращения "случайностей", потому что нет большого смысла редактировать специальные устройства в обычных текстовых редакторах. Кроме того, большинство обычных текстовых редакторов на самом деле не просто вызывают write()
для существующего файла, а вместо этого записывают в новый файл и переименовывают()
файл подкачки. заменить старый файл.Даже если у вас есть текстовый редактор, который поддерживает запись на месте, они обычно пытаются сначала обрезать файл, что, конечно, не поддерживается в устройстве со специальными символами.