Вопрос или проблема
Я хочу что-то вроде systemctl start-in-foreground logstash
, чтобы я мог видеть вывод в терминале и иметь возможность ctrl-c
это. Но я все равно хочу, чтобы systemd запускал процесс с правильными User=
и Group=
, EnvironmentFile=
и т.д.
Да и нет, в основном нет.
Обычные .service не могут быть запущены в переднем плане. Есть утилита systemd-run
, которая создает временные сервисы с указанными параметрами и имеет возможность подключать stdin/stdout сервиса либо через пайп, либо через pty, но она не может автоматически импортировать существующее определение .service – вам нужно вручную перечислить каждый параметр в командной строке:
systemd-run --pipe --collect --uid=foo -o EnvironmentFile=foo /usr/bin/logstash --foo
Ответ или решение
Да, вы можете протестировать службу systemd в режиме foreground, хотя это не так просто, как можно было бы ожидать. Давайте рассмотрим ваши вопросы более подробно и обсудим возможные подходы.
1. Проблема запуска служб systemd
Как вы отметили, обычные .service
файлы systemd не предназначены для работы в foreground. Это означает, что стандартная команда systemctl start
запускает службу в фоновом режиме, а её вывод не отображается в терминале. Однако, для целей отладки и тестирования иногда необходимо видеть логирование и взаимодействовать с процессом напрямую.
2. Использование systemd-run
Существует инструмент systemd-run
, который позволяет создавать временные службы с указанными вами параметрами. Однако стоит отметить, что он не может автоматически импортировать существующий .service
файл. Для его использования вам придется вручную перечислять все необходимые параметры. Например:
systemd-run --pipe --collect --uid=your_user --gid=your_group -o EnvironmentFile=your_env_file /usr/bin/logstash --your-options
В этом примере:
--pipe
перенаправляет stdin/stdout процесса.--collect
гарантирует, что выходные данные будут собраны после завершения службы.--uid
и--gid
задают необходимые пользователя и группу для вашего процесса.-o EnvironmentFile
загружает нужные переменные окружения.
3. Альтернативные подходы
Если вам нужно запустить службу в foreground с теми же параметрами, что и в её определении, вы можете рассмотреть возможность создания отдельного скрипта для запуска службы. Этот скрипт может использовать те же переменные окружения и настройки, что и ваш файл .service
. Если вы хотите запустить службу непосредственно, воспользуйтесь следующими шагами:
- Изучите ваш
.service
файл, выведите все параметры, которые вас интересуют (например,User=
,Group=
,EnvironmentFile=
). - Создайте скрипт, который будет запускать вашу службу с теми же параметрами.
Пример скрипта:
#!/bin/bash
source /path/to/your/envfile # Загрузка переменных окружения
exec /usr/bin/logstash --your-options # Запуск в foreground
Не забудьте установить права на выполнение для вашего скрипта. Теперь вы сможете увидеть вывод на терминале и завершать процесс с помощью CTRL-C
.
Заключение
Таким образом, хотя systemd не предлагает прямого способа для запуска служб в foreground с автоматическим импортом всех параметров, вы можете использовать комбинацию systemd-run
или создать собственный скрипт. Это позволит вам работать с вашим процессом в терминале так, как вам нужно, и при этом не потерять нужные настройки, касающиеся пользователя, группы и переменных окружения.
Если у вас возникнут дополнительные вопросы или потребуется помощь с конкретными настройками, не стесняйтесь обращаться!