Почему служба не запускается? Что я могу сделать, чтобы это исправить?
Потому что вы начинаете не так. Начни правильное дело. ☺
Подарок здесь -
StandardInput=socketв файле служебной единицы. Это указывает на то, что демон ожидает сокет в качестве стандартного ввода, и ожидается, что systemd предоставит его при порождении демона. "Но что это за розетка?" один спрашивает. systemd не знает волшебным образом, какой сокет использовать, и, конечно же, не подключает службы к каким-либо старым файловым дескрипторам сокетов, которые случайно остались в процессе №1.
Ответ заключается в том, что, в то время как другие в WWW (несколько лет назад) сделали это по-другому, (более поздний) пакет OpenSUSE для atftpd запускает atftpd как полноценный сервис, активируемый сокетами . Об активации сокетов в systemd написано много. Это тонкий вопрос, и его объяснение выходит за рамки данного ответа. Вот что вам нужно знать об этой конкретной службе здесь и сейчас:
Вы, системный администратор, не запускаете / останавливаете службу atftpd, запуская / останавливая модуль службы . Вы запускаете / останавливаете блок socket . Когда сокет запущен, systemd контролирует его, и трафик к сокету заставит systemd сам запустить модуль службы , подключив службу к сокету, который активировал его.
Итак, команды здесь
systemctl start atftpd.socket
иsystemctl stop atftpd.socket
.(То же самое сenable
иdisable
, конечно.) Также используйтеsystemctl status atftpd. {Service, socket}
, чтобы увидеть состояние как сокета, так и службы единицы измерения.(Вы заметите, что в файле
atftpd.service
нет раздела[Install], а в файле
atftpd.socket
есть. Опять же, это раздача, что это сокет ] модуль, который администратор запускает / останавливает / включает / отключает здесь.)Между прочим, содержимое вашего файла
/ etc / sysconfig / atftpd
является подделка. Они не соответствуютatftpd.sysconfig
в OpenSUSE . OpenSUSE соответствует тому, что systemd было сказано о демоне. Ваши локальные модификации не нужны в одном случае и совершенно неверны в другом.Ваш служебный модуль systemd по умолчанию использует
Type = simple
, но ваш/ etc / sysconfig / atftpd
использует параметр- daemon
. Несоответствие протокола готовности. Несоответствие протокола готовности приводит к тому, что службы не запускаются правильно или (что чаще всего) (ошибочно) диагностируются системой systemd как неисправные. Таким образом, у вас по-прежнему будет проблема, созданная вами, даже если вы переключитесь на управление блоком розетки вместо блока обслуживания. Удалите добавленную вами опцию- daemon
. Ваш демон должен не разветвляться и завершаться, чтобы указать готовность. Это полноценный сервис, активируемый сокетами в OpenSUSE. При отправке файл правильный.Точно так же systemd будет уже записывать весь вывод в системный журнал, стандартный вывод и стандартную ошибку демоном; и вы уже получаете доступ к этому журналу с помощью команды
journalctl
. Нет необходимости использовать- файл журнала
и настраивать дублирующую систему регистрации.
Как насчет
$ cat testfile
// Testing this
foobar
$ sed 'sx//\(.*\)x/*\1 */x' testfile
/* Testing this */
foobar
$
sx//
:поиск строк, содержащих//
\(.*\)x
:поместите оставшуюся часть линии в группу захвата 1 /*\1 */x
:заменить оставшуюся часть строки на/*
(начало комментария,C -стиль ), за которым следует содержимое группы захвата 1 (, упоминаемое как \1
), за которым следует*/
(конец комментария, стиль C -)Другой подход :делает поиск и замену условным при совпадении комментария вообще:
sed '\!//! {s!!/*!; s!$! */!}' file
Это читается как:
//
, то /*
*/