Arquivo de serviço ausente para pure-ftpd

1

Plano de fundo

Eu quero mudar algumas opções do Pure-FTPD. Como não tem arquivo de configuração, eu preciso adicionar argumentos de linha de comando. Meu sistema é o Debian Stretch, que usa o systemd.

O que eu tentei

Não há arquivo pure-ftpd.service em /etc/systemd/* nem em /usr/lib/systemd/* . Eu corri updatedb e, em seguida, locate pure-ftpd , o que não deu resultados. Executar systemctl status pure-ftpd (ou outros comandos como reiniciar) funciona bem.

Finalmente, encontrei uma maneira de fazer edições: systemctl edit pure-ftpd . Como sugerido por outra resposta neste site , digitei [Service] \n ExecStart=/usr/sbin/pure-ftpd -my options e pressione :wq . O Systemd recarrega o serviço e tudo está bem.

Executando systemctl status pure-ftpd , isso me diz:

pure-ftpd.service: Service has more than one ExecStart= setting, which is only allowed for Type=oneshot services. Refusing.

Eu não sei o que é um serviço pessoal. A documentação não diz quando usar qual, apenas "espera-se que o processo saia antes que o systemd inicie as unidades de acompanhamento". Não quero que o systemd espere que o pure-ftpd saia antes de iniciar outras "unidades" (outros serviços?), O que não é uma opção.

Grepping para pure ( grep -r pure ) em /etc/systemd e /usr/lib/systemd fornece apenas o resultado que eu mesmo criei: /etc/systemd/system/pure-ftpd.service.d/override.conf . Não parece haver um arquivo de serviço, mas ele se queixa de uma opção ExecStart duplamente definida.

Chamar /etc/init.d/pure-ftpd diretamente também não funciona. Rastreando esse script de shell, vejo o systemd ligado a isso e o seqüestra.

Eu também corri strace systemd restart pure-ftpd . Percorrendo, isso chama minha atenção:

socket(AF_UNIX, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0) = 3 connect(3, {sa_family=AF_UNIX, sun_path="/run/systemd/private"}, 22) = 0 sendmsg(3, {msg_name=NULL, msg_namelen=0, msg_iov=[{iov_base="socket(AF_UNIX, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0) = 3 connect(3, {sa_family=AF_UNIX, sun_path="/run/systemd/private"}, 22) = 0 sendmsg(3, {msg_name=NULL, msg_namelen=0, msg_iov=[{iov_base="%pre%AUTH EXTERNAL ", iov_len=15}, {iov_base="30", iov_len=2}, {iov_base="\r\nNEGOTIATE_UNIX_FD\r\nBEGIN\r\n", iov_len=28}], msg_iovlen=3, msg_controllen=0, msg_flags=0}, MSG_DONTWAIT|MSG_NOSIGNAL) = 45 sendmsg(3, {msg_name=NULL, msg_namelen=0, msg_iov=[{iov_base="l$%pre%%pre%%pre%%pre%%pre%%pre%0%pre%%pre%%pre%o%pre%%pre%%pre%%pre%/org/fre"..., iov_len=176}, {iov_base="%pre%%pre%%pre%pure-ftpd.service%pre%%pre%%pre%%pre%%pre%%pre%repl"..., iov_len=36}], msg_iovlen=2, msg_controllen=0, msg_flags=0}, MSG_DONTWAIT|MSG_NOSIGNAL) = 212 ---------------------->---------------------->---------------------->---------------------->---------------------->--------------------------^^^ AUTH EXTERNAL ", iov_len=15}, {iov_base="30", iov_len=2}, {iov_base="\r\nNEGOTIATE_UNIX_FD\r\nBEGIN\r\n", iov_len=28}], msg_iovlen=3, msg_controllen=0, msg_flags=0}, MSG_DONTWAIT|MSG_NOSIGNAL) = 45 sendmsg(3, {msg_name=NULL, msg_namelen=0, msg_iov=[{iov_base="l$%pre%%pre%%pre%%pre%%pre%%pre%0%pre%%pre%%pre%o%pre%%pre%%pre%%pre%/org/fre"..., iov_len=176}, {iov_base="%pre%%pre%%pre%pure-ftpd.service%pre%%pre%%pre%%pre%%pre%%pre%repl"..., iov_len=36}], msg_iovlen=2, msg_controllen=0, msg_flags=0}, MSG_DONTWAIT|MSG_NOSIGNAL) = 212 ---------------------->---------------------->---------------------->---------------------->---------------------->--------------------------^^^

Portanto, envia algo sobre "/run/systemd/privatesystemctl disable pure-ftpdinit.dpure-ftpd.servicepure-ftpd-wrapper%code%%code%%code%%code%%code%repl"... sobre um soquete unix. E, evidentemente, o systemd entende o que está falando. Parece-me como se houvesse um arquivo de serviço de modelo que é usado por padrão se o real estiver ausente.

Anexando strace ao proprietário de %code% (sem surpresa: PID 1 / init), vejo a autenticação e a mensagem freedesktop chegando, após o que ela responde imediatamente com uma mensagem de erro sobre o serviço não ter sido carregado corretamente. Nunca verifica a existência de nenhum arquivo nem lê de nenhum.

Soluções alternativas

  • Eu posso %code% e editar o arquivo %code% para que ele não fique conectado ao systemd. Mas isso é apenas um hack feio. Deveria haver uma maneira melhor.
  • Depois de digitar tudo isso, achei outra resposta descrevendo que você pode - afinal de contas! - faça isso através de um arquivo de configuração e inicie %code% (que é o padrão no script init.d, mas quem sabe se o systemd usa isso). No entanto, agora quero saber a resposta para a pergunta atual:

Pergunta

Como posso fornecer opções adicionais de linha de comando?

    
por Luc 18.06.2017 / 02:04

0 respostas