davmail systemd launcher no servidor headless

1

Estou tentando seguir o guia ArchWiki para escrever um arquivo de serviço personalizado para iniciar DavMail como um daemon do sistema. Anteriormente eu tinha uma linha no meu ~ / .xinitrc que lia

nohup /usr/bin/davmail /etc/conf.d/davmail.properties

de acordo com as instruções do DavMail (onde /usr/bin/davmail é um symlink para /usr/share/java/davmail/davmail.sh ). Agora que tornei o computador um servidor sem cabeçalho, gostaria que o iniciador automático fosse independente de uma sessão X.

Todos os guias que eu vi online para um script do DavMail assumem que a distro está usando o sysvinit, não o systemd. Minha tentativa em um arquivo de serviço systemd personalizado é

[Unit]
Description=DavMail Exchange Gateway
Requires=network.target
After=network.target

[Service]
Type=forking
RemainAfterExit=yes
ExecStart=/usr/bin/davmail /etc/conf.d/davmail.properties
ExecStop=killall davmail

[Install]
WantedBy=multi-user.target

que não consegue bifurcar corretamente. Prefigurar o comando ExecStart com /usr/bin/nohup não ajuda, porque o systemd reclama de um argumento inválido (preferindo assumir o controle da própria daemonização, se eu estiver entendendo corretamente as respostas anteriores do fórum). Alterar o tipo de serviço para oneshot ou simple também falha.

Acho que um problema aqui é que o DavMail requer que um intérprete Java seja executado, e os arquivos do serviço systemd não são tão flexíveis quanto os scripts de shell ao entregar o trabalho para um interpretador Java. Mas talvez haja uma explicação muito mais simples. Alguém já escreveu com sucesso um arquivo de serviço do systemd para DavMail que eles estariam dispostos a compartilhar?

    
por biqu 02.04.2013 / 22:23

3 respostas

2

Você deve defini-lo como um serviço simples (o forking é para o processo que termina quando o daemon já está iniciado). Pois está funcionando como um encanto no Arch

[Unit]
Description=DavMail Exchange Gateway
Requires=network.target
After=network.target

[Service]
Type=simple
RemainAfterExit=no
ExecStart=/usr/bin/davmail /etc/conf.d/davmail.properties
ExecStop=killall davmail

[Install]
WantedBy=multi-user.target
    
por 15.03.2014 / 03:35
0

Para aqueles que não têm um debian ou uma distro com base nele e baixaram o pacote genérico do Linux (que inclui o davmail.sh), o seguinte funcionou para mim:

[Unit]
Description=DavMail Exchange Gateway
Requires=network.target
After=network.target

[Service]
Type=forking
PIDFile=/opt/davmail/davmail.pid
ExecStart=/opt/davmail/davmail.sh /opt/davmail/davmail.properties

[Install]
WantedBy=multi-user.target
    
por 10.04.2014 / 13:57
0

Depois de um pouco de experimentação, encontrei um pouco mais otimizado solução para usar o Davmail com a diretiva davmail.server=true , supondo que você tenha executado uma instalação manual.

[Unit]  
Description=DavMail Exchange Gateway  
Requires=network.target  
After=network.target  

[Service]  
Type=simple  
RemainAfterExit=no  
GuessMainPid=yes  
Environment=BASE=<< YOUR_MANUAL_INSTALL_PATH_HERE >>  
Environment=PROPERTIES=<< PATH_TO_davmail.properties >>
ExecStartPre=/usr/bin/bash -c "for i in ${BASE}/lib/*; do /usr/bin/systemctl set-environment CLASSPATH=${CLASSPATH}:$i ; done"  
ExecStart=/usr/bin/java -Xms1G -Xmx1G -XX:ErrorFile=/var/log/davmail_errors.log -XX:-HeapDumpOnOutOfMemoryError -Djava.awt.headless=true -Dsun.net.inetaddr.ttl=60 -cp ${BASE}/davmail.jar:${CLASSPATH} davmail.DavGateway ${PROPERTIES}  
ExecReload=/bin/kill -HUP ${MAINPID}  
ExecStop=/bin/kill -QUIT ${MAINPID}  
Restart=always  
RestartSec=3  

[Install]  
WantedBy=multi-user.target

Para aqueles que fizeram instalações empacotadas, eles podem comentar a linha "ExecStartPre" e, em seguida, definir BASE = / usr / share / java e PROPERTIES = / etc / davmail.properties.

Razões que isso é "melhor" inclui mostrar a saída do console de processo java em seu local syslog padrão ( /var/log/syslog || /var/log/messages || where), facilitando a depuração quando a situação fica ruim.

    
por 30.08.2017 / 23:32