我正在尝试遵循 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 抱怨参数无效(如果我正确理解以前的论坛答案,则更愿意控制守护进程本身)。将服务类型更改为oneshot
或simple
也失败。
我认为这里的一个问题是 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
,从而在出现问题时更容易进行调试。