Вопрос или проблема
Я совсем новичок в Linux, и мне нужна помощь. Я пытаюсь запустить процессы узла блокчейна в фоновом режиме, чтобы они работали без моего входа в систему.
Я использую systemctl
, чтобы запустить мой процесс в фоновом режиме.
Вот мои .service
файлы
Корневая директория, команда, идентификаторы и пользователь были просто отредактированы в файле, они не импортируются. Также команды работают в “foreground”, то есть когда я просто запускаю их в терминале.
1-й
[Unit]
Description=MY_DESC
After=network.target
[Service]
Type=simple
Restart=always
RestartSec=1
User=USER
WorkingDirectory=ROOT_DIR
ExecStart=MY_COOL_CMD
StandardOutput=journal
StandardError=journal
SyslogIdentifier=MY_ID
StartLimitInterval=0
LimitNOFILE=65536
LimitNPROC=65536
[Install]
WantedBy=multi-user.target
2-й файл сервиса
[Unit]
Description=MY_DESC
After=network.target 1st-service.service
[Service]
Type=simple
Restart=always
RestartSec=1
User=USER
WorkingDirectory=HOME_DIR
Environment="DAEMON_NAME=CMD_DIR"
Environment="DAEMON_HOME=HOME_DIR"
Environment="DAEMON_ALLOW_DOWNLOAD_BINARIES=false"
Environment="DAEMON_RESTART_AFTER_UPGRADE=true"
Environment="UNSAFE_SKIP_BACKUP=true"
ExecStart=MY_COOL_CMD
StandardOutput=journal
StandardError=journal
SyslogIdentifier=MY_ID
StartLimitInterval=0
LimitNOFILE=65536
LimitNPROC=65536
[Install]
WantedBy=multi-user.target
Я успешно активировал оба файла. Они, похоже, работают, когда я вошел в систему, но не когда меня нет. Ошибок нет, но когда я проверяю журналы, номера блоков не увеличиваются достаточно (последний раз я выходил из системы неделю назад, и высота блока увеличилась всего на 100,000 блоков. Это немного). Также, когда я пытаюсь проверить журналы за прошлое время (между 6 и 7 часами назад), журналы не показывают никаких записей…
Вот что я получаю, когда запрашиваю статус
1-й
my.service - MY_DESC
Loaded: loaded (/etc/systemd/system/my.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2024-11-29 22:57:00 CET; 1 week 0 days ago
Main PID: 1940037 (geth)
Tasks: 23 (limit: 19099)
Memory: 9.8G
CPU: 4d 21h 2min 16.071s
CGroup: /system.slice/my.service
└─1940037 MY_COOL_CMD
2-й файл
my.service - my
Loaded: loaded (/etc/systemd/system/my.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2024-11-29 23:02:23 CET; 1 week 0 days ago
Main PID: 1940098 (cosmovisor)
Tasks: 28 (limit: 19099)
Memory: 4.7G
CPU: 3d 4h 49min 4.542s
CGroup: /system.slice/my.service
├─1940098 CMD_HERE
└─1940111 CMD_HERE
Это когда я вошел в систему.
Если вам нужно увидеть что-то еще, чтобы дать мне совет по этому вопросу, пожалуйста, дайте знать.
Большое спасибо за ваше время и экспертизу!
Ответ или решение
Возможно ли, что процесс systemctl не будет работать без моего входа на сервер?
В начале работы с Linux, особенно для запуска фоновых процессов, таких как узлы блокчейна, понимание работы системы управления службами, такой как systemctl
, имеет жизненно важное значение. Рассмотрим, возможно ли, что запущенные с помощью systemctl
процессы могут потерять активность, если вы не находитесь в системе.
1. Актуальность фона
Системные службы, настроенные с помощью systemctl
, созданы для работы независимо от пользовательских сессий. Как только вы активируете службу командой systemctl start <имя_сервиса>
, она должна продолжать работу, даже если вы выйдете из системы.
2. Проверка вашего .service файла
В вашем случае вы привели два .service
файла. Основные параметры, такие как User
, WorkingDirectory
, и ExecStart
, выглядят корректно. Важно убедиться, что:
- Параметр
User
установлен на нужного пользователя, обладающего правами запуска команд. - Путь в
WorkingDirectory
указан правильно и доступен для данного пользователя. - Команды в
ExecStart
корректны и работают, когда их запускают из консоли.
3. Журналирование и отладка
Когда вы проверяете состояние служб и обращаетесь к журналу с помощью journalctl
, важно понимать, как записываются логи и что они могут не отражать все действия ваших служб. Если в журнале не отображается активности, возможно:
- Процессы корректно не инициализируются в фоновом режиме.
- Условие
After=network.target 1st-service.service
может не обеспечивать необходимую последовательность запуска.
Вы можете использовать команды для более подробного лога:
journalctl -u имя_вашей_службы.service
Это должно помочь вам выяснить, почему не происходит ожидаемого обновления.
4. Общие рекомендации
- Убедитесь, что службы настроены на автоматический перезапуск. Вы указали
Restart=always
, что правильно, но проверяйте, правильно ли работает этот механизм. - Настройте параметры, такие как
TimeoutStartSec
, если сервисы требуют больше времени на инициализацию. - Запускайте
systemctl status <имя_сервиса>
через регулярные промежутки времени, чтобы отслеживать их состояние.
5. Диагностика проблем
Если после всех проверок ваши процессы не работают:
- Попробуйте временно удалить атрибуты, такие как
User
, чтобы запустить их от имениroot
и посмотрите, будет ли это иметь значение. - Проверяйте версию программного обеспечения, которое вы используете, иногда обновления могут вызывать проблемы с совместимостью.
- Настройте уведомления для вашего сервиса, чтобы быть в курсе его статуса.
Заключение
Службы, запущенные с помощью systemctl
, должны функционировать даже в вашем отсутствии. Если вы сталкиваетесь с проблемами, важно систематически проверять конфигурацию службы, логи и журналы для выявления причин. Если остальные советы не помогут, рекомендуется обратиться к сообществу или профессиональному администратору для дополнительной помощи.