배경
Pure-FTPD의 일부 옵션을 변경하고 싶습니다. 구성 파일이 없으므로 명령줄 매개변수를 추가해야 합니다. 내 시스템은 systemd를 사용하는 Debian Stretch입니다.
내가 시도한 것
/etc/systemd/*
또는 에 pure-ftpd.service 파일이 없습니다 /usr/lib/systemd/*
. 나는 달렸 updatedb
지만 locate pure-ftpd
아무런 결과도 얻지 못했습니다. 실행 systemctl status pure-ftpd
(또는 재부팅과 같은 다른 명령)이 제대로 작동합니다.
마침내 나는 그것을 편집하는 방법을 찾았습니다: systemctl edit pure-ftpd
. 제안대로이 사이트의 또 다른 답변, 을 입력 [Service] \n ExecStart=/usr/sbin/pure-ftpd -my options
하고 클릭했습니다 :wq
. Systemd가 서비스를 다시 로드하면 모든 것이 잘 작동합니다.
그것을 실행하면 systemctl status pure-ftpd
다음과 같이 알려줍니다.
pure-ftpd.service: 서비스에는 여러 ExecStart= 설정이 있으며 Type=oneshot 서비스에만 적용됩니다. 거부하다.
일회성 서비스가 무엇인지 모르겠습니다. 문서에는 언제 어느 것을 사용해야 하는지는 나와 있지 않으며 "systemd가 후속 장치를 시작하기 전에 프로세스가 종료되어야 합니다"라고만 나와 있습니다. 나는 systemd가 다른 "유닛"(다른 서비스?)을 시작하기 전에 pure-ftpd가 종료될 때까지 기다리는 것을 원하지 않으므로 이는 옵션이 아닙니다.
둘 다에서 Find()를 pure
사용하면 내가 직접 생성한 결과만 제공됩니다. 서비스 파일은 없는 것 같은데, ExecStart 옵션이 이중으로 정의되어 있다고 불평합니다.grep -r pure
/etc/systemd
/usr/lib/systemd
/etc/systemd/system/pure-ftpd.service.d/override.conf
직접 통화는 불가능합니다 /etc/init.d/pure-ftpd
. 쉘 스크립트를 추적해 보니 systemd가 이 스크립트에 연결되어 하이재킹된 것을 발견했습니다.
나도 도망쳤다 strace systemd restart pure-ftpd
. 스크롤을 해보니 이것이 내 관심을 끌었습니다.
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="\0AUTH 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\1\4\1$\0\0\0\1\0\0\0\240\0\0\0\1\1o\0\31\0\0\0/org/fre"..., iov_len=176}, {iov_base="\21\0\0\0pure-ftpd.service\0\0\0\7\0\0\0repl"..., iov_len=36}], msg_iovlen=2, msg_controllen=0, msg_flags=0}, MSG_DONTWAIT|MSG_NOSIGNAL) = 212
---------------------->---------------------->---------------------->---------------------->---------------------->--------------------------^^^
"\21\0\0\0pure-ftpd.service\0\0\0\7\0\0\0repl"...
따라서 유닉스 소켓을 통해 일부 정보를 보냅니다. 분명히 systemd는 그것이 무엇을 말하는지 알고 있습니다. 실제 서비스 파일이 존재하지 않는 경우 기본적으로 사용되는 템플릿 서비스 파일이 있는 것 같습니다.
(당연하지: PID 1/init)의 소유자에 strace를 연결하면 /run/systemd/private
인증 및 freedesktop 메시지가 들어오는 것을 본 후 즉시 서비스가 올바르게 로드되지 않는다는 오류 메시지로 응답합니다. 파일이 존재하는지 확인하지 않으며 파일을 읽지도 않습니다.
해결책
- systemd에 연결되지 않도록 파일을
systemctl disable pure-ftpd
편집 할 수 있습니다 .init.d
그러나 이것은 단지 추악한 해킹일 뿐입니다. 더 좋은 방법이 있어야 합니다. - 이것을 모두 입력한 후 찾았습니다.또 다른 대답당신이 무엇을 할 수 있는지 설명해보세요 - 결국! -- 구성 파일 및 시작을 통해
pure-ftpd-wrapper
(이는 init.d 스크립트의 기본값이지만 systemd에서 이를 사용하는지 아는 사람은 없습니다) 그러나 이제 나는 실제 질문에 대한 답을 알고 싶습니다.
질문
추가 명령줄 옵션을 제공하려면 어떻게 해야 합니까?
답변1
systemd에는 pure-ftpd.service 파일을 생성할 수 있는 일부 생성기가 포함되어 있다는 것을 알고 계셨습니까? 결과는 별로 좋지 않은 유닛 파일이지만 작동합니다.
생성된 폴더는 /run/systemd/generator.late입니다. cat pure-ftpd.service를 사용하여 소스 코드를 볼 수 있습니다.
그런 다음 새 /lib/systemd/system/pure-ftpd.service를 만들고 /run/ 유닛의 내용을 여기에 넣습니다(그러면 해당 유닛의 코드를 조정할 수 있습니다).
데비안은 더 이상 init.d를 사용하지 않으며(systemd를 사용할 때) 모든 비서비스 서비스는 생성기에 의해 자동으로 생성된다는 점을 고려하세요.
추가 정보:
https://www.freedesktop.org/software/systemd/man/systemd.generator.html https://www.freedesktop.org/software/systemd/man/systemd-sysv-generator.html
systemd-sysv-generator는 시작 시 및 시스템 관리자 구성을 다시 로드할 때 /etc/init.d/*에 SysV init 스크립트용 래퍼 .service 단위를 생성하는 생성기입니다. 이를 통해 systemd(1)는 이를 기본 유닛처럼 지원할 수 있습니다.