Eu tenho um cenário incomum em que desejo que um serviço Apache seja executado como um usuário sem privilégios; isso está escutando em uma porta não raiz (8000+). Estou funcionando, mas tenho alguns problemas com o serviço systemd personalizado que criei para gerenciá-lo.
Aqui está a unidade de serviço:
[Unit]
Description=Apache Modperl service for {user}
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
User={user}
Group={user}
Environment=LANG=C
PIDFile={Apache pid file, accessible by user}
ExecStart=/usr/sbin/httpd -f {config file}
ExecReload=kill -USR1 $MAINPID
# Send SIGWINCH for graceful stop
KillSignal=SIGWINCH
KillMode=mixed
PrivateTmp=true
[Install]
WantedBy=multi-user.target
Iniciar/parar o serviço funciona bem, mas ao recarregar, qualquer problema na configuração faz com que todo o processo morra. Eu não quero que ele morra, mas em vez disso, mantenha o processo antigo em execução com a configuração anterior (assim como o serviço httpd padrão quando você recarrega uma configuração que não funciona).
Para referência, isso está no Oracle Linux 8 e aqui está a unidade de serviço httpd padrão (root) que usei como modelo:
[Unit]
Description=The Apache HTTP Server
Wants=httpd-init.service
After=network.target remote-fs.target nss-lookup.target httpd-init.service
Documentation=man:httpd.service(8)
[Service]
Type=notify
Environment=LANG=C
ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND
ExecReload=/usr/sbin/httpd $OPTIONS -k graceful
# Send SIGWINCH for graceful stop
KillSignal=SIGWINCH
KillMode=mixed
PrivateTmp=true
[Install]
WantedBy=multi-user.target
Não sei se deveria usar type notify
em vez de forking
, mas quando tento usar notify
, a inicialização do serviço falha com esta mensagem no journalctl:
Failed with result 'protocol'.
Não recebo nenhum problema de permissão ou outras mensagens mais detalhadas ao tentar usar o tipo notify
.