헤드리스 서버의 davmail systemd 실행기

헤드리스 서버의 davmail systemd 실행기

나는 ArchWiki 가이드에 따라 글을 쓰려고 노력하고 있습니다.맞춤형 서비스 파일발표DAF 메일시스템 전반의 데몬 역할을 합니다. 과거에는 ~/.xinitrc에 다음과 같은 줄이 있었습니다.

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

DavMail 지침을 따르십시오( /usr/bin/davmail심볼 링크는 어디에 있습니까 /usr/share/java/davmail/davmail.sh?). 이제 내 컴퓨터를 헤드리스 서버로 전환했으므로 자동 시작기가 X 세션과 독립적이기를 원합니다.

DavMail init 스크립트에 관해 온라인에서 본 모든 가이드는 배포판이 systemd가 아닌 sysvinit를 사용하고 있다고 가정합니다. 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

제대로 포크할 수 없습니다. systemd가 유효하지 않은 인수에 대해 불평하므로 ExecStart명령 접두어를 붙이는 /usr/bin/nohup것은 도움이 되지 않습니다(이전 포럼 답변을 올바르게 이해했다면 데몬 자체를 제어하는 ​​것을 선호할 것입니다). 서비스 유형을 oneshot또는 로 변경해 simple도 실패합니다.

여기서 한 가지 문제는 DavMail을 실행하려면 Java 인터프리터가 필요하고 systemd 서비스 파일은 Java 인터프리터에 작업을 넘겨주는 쉘 스크립트만큼 유연하지 않다는 것입니다. 하지만 어쩌면 더 간단한 설명이 있을 수도 있습니다. 공유하고 싶은 DavMail용 시스템 서비스 파일을 성공적으로 작성한 사람이 있습니까?

답변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

데비안이나 이를 기반으로 한 배포판이 없고 일반 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이것이 "더 나은" 이유에는 기본 syslog 위치(|| || 어디에 있든)에 Java 프로세스 콘솔 출력을 표시하여 /var/log/messages문제가 발생할 경우 디버깅하기가 더 쉽다는 점 등이 포함됩니다.

관련 정보