Введение

Введение

Введение

Недавно я обновился до Fedora 17 и привыкаю к ​​новому systemctlменеджеру демонов вместо скриптов инициализации оболочки.

Функция, которая мне нужна в некоторых моих демонах, — это возможностьвзаимодействовать со своими консолямипотому что некорректные отключения, не инициированные самим процессом, могут привести к повреждению базы данных. Так, systemctl stop service-name.serviceнапример, выполнение может привести к необратимой потере данных.

Эти консоли считывают пользовательский ввод через stdin или аналогичные методы, поэтому в своей старой ОС я размещал эти демоны на переднем плане в сеансе screen, и яприостановленныйэтот сеанс экрана с ^A ^z. Также стоит отметить, что теперь я сделал systemctlэто автоматически, если компьютер перезагружается, но это все еще не решает мою потенциальную проблему повреждения данных, которую я пытаюсь избежать.


Мой вопрос

Есть ли способ использовать systemctlдля прямого взаимодействия с консолью порождаемых им процессов? Могу ли я подключить процесс, systemctlчтобы получить доступ к его консоли?


Спасибо

Вы, ребята, всегда даете отличные ответы, поэтому я обращаюсь к вам!

решение1

Похоже, вы сможете перенаправить его на tty.

StandardInput=

Управляет тем, к чему подключен файловый дескриптор 0 (STDIN) выполняемых процессов. Принимает одно из значений null, tty, tty-force, tty-fail или socket. Если выбрано null, стандартный ввод будет подключен к /dev/null, т. е. все попытки чтения процессом приведут к немедленному EOF. Если выбрано tty, стандартный ввод подключается к TTY (как настроено TTYPath=, см. ниже), и выполняемый процесс становится управляющим процессом терминала. Если терминал уже управляется другим процессом, выполняемый процесс ждет, пока текущий управляющий процесс не освободит терминал.tty-force похож на tty, но выполняемый процесс принудительно и немедленно становится управляющим процессом терминала, потенциально удаляя предыдущие управляющие процессы с терминала.tty-fail похож на tty, но если на терминале уже есть управляющий процесс, запуск выполняемого процесса завершается неудачей. Параметр socket действителен только в активируемых сокетами службах и только когда файл конфигурации сокета (см. systemd.socket(5) для получения подробной информации) указывает только один сокет. Если этот параметр установлен, стандартный ввод будет подключен к сокету, из которого была активирована служба, что в первую очередь полезно для совместимости с демонами, разработанными для использования с традиционным демоном inetd(8). Этот параметр по умолчанию равен null.

Ссылка на цитату

О, а если это не сработает, мы сделаем что-то действительно сложное с сокетами Unix, и я уверен, вы это поймете.любовь.

К черту эту чушь, попробуйте что-то вроде этого, если вышеизложенное неприемлемо:

Вы можете попробовать записать в его pid-каталог /proc. Допустим, pid вашего демона 2000, попробуйте записать в /proc/2000/fd/0

источник

Эту строку можно добавить в ExecStop=, что избавит вас от необходимости взаимодействовать вручную.

Связанный контент