Я пытаюсь запустить двоичный файл сервера Golang как службу с Systemd на Centos 8, но я получаю сообщение об ошибке.
Это мой сценарий /etc/systemd/system/myserverapp.service
[Unit]
Description=MyServerApp
[Service]
Type=simple
ExecStart=/var/mybin/myserverapp
[Install]
WantedBy=multi-user.target
Вот что я набираю:
sudo systemctl enable myserverapp
sudo systemctl start myserverapp
но он не запускается, и если я наберу:
sudo systemctl status myserverapp
вот что я получаю:
● myserverapp.service - MyServerApp
Loaded: loaded (/etc/systemd/system/myserverapp.service; enabled; vendor preset: disabled)
Active: failed (Result: exit-code) since Mon 2020-04-20 19:36:36 UTC; 2s ago
Process: 11228 ExecStart=/var/mybin/myserverapp (code=exited, status=203/EXEC)
Main PID: 11228 (code=exited, status=203/EXEC)
Apr 20 19:36:36 myserver systemd[1]: myserverapp.service: Main process exited, code=exited, status=203/EXEC
Apr 20 19:36:36 myserver systemd[1]: myserverapp.service: Failed with result 'exit-code'.
Apr 20 19:36:36 myserver systemd[1]: myserverapp.service: Service RestartSec=100ms expired, scheduling restart.
Apr 20 19:36:36 myserver systemd[1]: myserverapp.service: Scheduled restart job, restart counter is at 5.
Apr 20 19:36:36 myserver systemd[1]: Stopped MyServerApp.
Apr 20 19:36:36 myserver systemd[1]: myserverapp.service: Start request repeated too quickly.
Apr 20 19:36:36 myserver systemd[1]: myserverapp.service: Failed with result 'exit-code'.
Apr 20 19:36:36 myserver systemd[1]: Failed to start MyServerApp.
обратите внимание, что если я бегу: sudo /var/mybin/myserverapp
из оболочки двоичный файл сервера работает правильно
Я нашел проблему!
Это произошло из-за Политика SELinux, который отрицал Systemd для запуска моего серверного приложения как службы, так как оно было в нестандартном каталоге bin /var/mybin/
.
вы можете проверить, что SELinux отклонил выполнение, выполнив команду:
sudo ausearch -m avc -ts today
Есть 2 возможных решения:
1) переместите двоичный файл в стандартный каталог bin, например /usr/local/bin
2) добавить bin_t
SELinux для /var/mybin/myserverapp
файл, чтобы Systemd могла запускать его как службу.
Чтобы применить решение 2), вам просто нужно выполнить команду:
sudo semanage fcontext -a -t bin_t /var/mybin/myserverapp
если вы хотите перечислить все текущие правила SELinux, просто введите:
sudo semanage fcontext -l
в случае semanage
не установлен в вашей системе, вы можете просто установить его с помощью этой команды:
sudo dnf install policycoreutils-python-utils