无头服务器上的 davmail systemd 启动器

无头服务器上的 davmail systemd 启动器

我正在尝试遵循 ArchWiki 指南来编写定制服务文件推出达夫邮件作为系统范围的守护进程。以前我的 ~/.xinitrc 中有一行内容是

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

按照 DavMail 说明(其中/usr/bin/davmail是 的符号链接/usr/share/java/davmail/davmail.sh)。现在我已经将计算机变成了无头服务器,我希望自动启动器独立于 X 会话。

我在网上看到的所有关于 DavMail 初始化脚本的指南都假设发行版使用的是 sysvinit,而不是 systemd。我对自定义 systemd 服务文件的尝试是

[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

无法正确分叉。在ExecStart命令前面加上/usr/bin/nohup没有任何帮助,因为 systemd 抱怨参数无效(如果我正确理解以前的论坛答案,则更愿意控制守护进程本身)。将服务类型更改为oneshotsimple也失败。

我认为这里的一个问题是 DavMail 需要 Java 解释器才能运行,而 systemd 服务文件在将工作移交给 Java 解释器方面不如 shell 脚本那么灵活。但也许有一个更简单的解释。有没有人成功地为 DavMail 编写了一个他们愿意分享的 systemd 服务文件?

答案1

您必须将其定义为简单服务(分叉适用于在守护进程已启动时完成的进程)。因为它在 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

答案2

对于那些没有 debian 或基于它的发行版并下载了通用 Linux(其他)软件包(包括 davmail.sh)的人,以下内容对我有用:

[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

答案3

davmail.server=true经过一些实验后,假设您已执行手动安装,我找到了使用 Davmail 与指令的更佳解决方案。

[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

对于那些已经完成打包安装的人来说,他们可能可以注释掉“ExecStartPre”行,然后设置 BASE=/usr/share/java 和 PROPERTIES=/etc/davmail.properties 。

/var/log/syslog这“更好”的原因包括在默认系统日志位置( || || 无论何处)显示 java 进程控制台输出/var/log/messages,从而在出现问题时更容易进行调试。

相关内容