무엇이것 말고도체계화된

무엇이것 말고도체계화된

이 질문아마도 내가 여기서 묻는 것과 관련이 있을 것입니다.

이는 다음과 같은 맥락에서입니다.https://github.com/bstarynk/helpcovid/(Linux용 GPLv3+ 소프트웨어, 현재 -2020년 4월 -활동적인개발은 Linux용 특수 C++ 다중 스레드 웹 애플리케이션이므로진행중인 작업2020년 4월 8일)

b-star-y.techLinux/Debian/Buster를 실행하는 호스트에서 VPS를 임대하고 있습니다 .

나는 다른 사람들과 함께 발전하고 있다도움말코비드, C++17의 Linux용으로 코딩된 다중 스레드 GPLv3+ 웹 애플리케이션 소프트웨어입니다.

나는 익숙하지 않다systemd, 해당 호스트의 Debian/Buster가 사용하거나docker

구현하고 싶습니다다음 무한 루프d 파일 트리 에서 git clone.

  • git pull
  • make
  • ./helpcovid -D -T2stderr과 stdout을 모두 일부 파일로 리디렉션하여 실행합니다 .
  • sleep 5

그리고무한 반복.

나는 다음을 사용하고 싶은 유혹을 느낀다.크론탭직업, 아니면 atd아마도batch

더 좋은 방법이 있습니까 systemd?

당신은 나에게 이메일을 보낼 수 있습니다[email protected]

답변1

약 25년 동안 우리는 권한이 없는 사용자가 임시 서비스를 실행할 수 있는 도구 세트를 보유해 왔습니다. Daniel J. Bernstein의 daemontools가장 초기 중 하나입니다. 하나는 그렇지 않습니다가지다스캔 디렉터리 및 기타 인프라를 설정합니다. 아래에서 프로그램을 실행할 수 있습니다.supervise곧장. M. Bernstein의 UCSPI-TCP 도구 세트또한, TCP 연결을 수락하고 작업을 수행해야 하는 서비스를 처리하기 위해 비슷한 기간 동안 사용했던 여러 도구 세트의 예입니다.

systemd가 필요 없이 동일한 작업을 수행하는 다른 도구 세트가 있으며 물론 systemd를 사용하면 가능합니다.또한임시 사용자별 서비스를 설정합니다.

지금은 2020년입니다. 불안정하고 위험한 PID 파일 메커니즘을 사용하는 새로운 프로그램을 작성할 이유가 없습니다. 여러분이 작성한 PID 파일 코드는 필요하지 않습니다.

마찬가지로 TCP 서버를 작성하여 다음을 수행하는 것이 좋습니다.상속하다이미 열려 있는 파일 설명자로서의 청취 소켓입니다. 실제로는 이런 식이다시스템 전체int에서 운영하는 서비스는 전통적으로 1980년대부터 운영되어 왔습니다. 이는 사용자별 서비스로도 가능합니다. s6 및 nosh 도구 세트와 실제로 systemd는 모두 서비스에 청취 소켓을 제공할 수 있는 방법을 제공합니다. 그럴 필요는 없어어느여러분이 작성한 nonce URL 구문 분석 코드는 많은 일반 구문 분석기와 마찬가지로 URL이 취할 수 있는 모든 형식을 처리하지 않습니다.

불행하게도 제가 말했듯이 귀하의 cpp-httplib라이브러리에는 생성자나 함수 멤버가 없습니다.주어진청취 소켓에 대한 파일 설명자입니다. 소켓 파일 설명자를 상속하는 것이 지난 30년 동안 일반적인 관행이었다는 점을 고려하면 이는 해당 라이브러리 설계에 있어 중대한 실수입니다.

무엇이것 말고도체계화된

둘 다내 Nosh 도구 세트그리고Laurent Bercot의 s6 도구 세트임시 사용자별 서비스로 nonce 프로그램을 실행하는 방법을 제공합니다.

nosh 도구 세트 아래에는 서비스를 처리하기 위한 다양한 프로그램이 포함된 하위 helpcovid디렉토리가 있는 하위 디렉토리가 있습니다.service

helpcovid/service/starthelpcovid/service/stop상당히 최소한입니다 .

#!/bin/nosh                                                         
#Start file generated from ./helpcovid.socketand ./helpcovid.service
true
#!/bin/nosh
#Stop file generated from ./helpcovid.socketand ./helpcovid.service
true

고기는 다음 helpcovid/service/run과 같습니다 helpcovid/service/service.

#!/bin/nosh
#Run file generated from ./helpcovid.socketand ./helpcovid.service
#Starynkevitch helpcovid listening socket
tcp-socket-listen --systemd-compatibility ::0 50002
envdir env
setenv LC_ALL fr_FR.UTF-8
chdir /home/basile/dev/helpcovid/test
./service
#!/bin/nosh
#Service file generated from ./helpcovid.service
#Starynkevitch helpcovid service
sh -c 'exec /home/basile/dev/helpcovid/work/helpcovid ${flags}'

그리고 helpcovid/service/restart다시 시작 논리를 제어합니다.

#!/bin/sh
#Restart file generated from ./helpcovid.service
sleep 5
exec true   # ignore script arguments

이것은 의 사용자별 인스턴스에 제공하여 실행됩니다 service-manager. 도구 세트는 소켓에서 바인딩 및 수신을 수행하고, envdir에서 환경 변수 구성을 읽고, LISTEN_FDS작업 디렉터리를 테스트 디렉터리가 있는 위치로 변경한 후 프로토콜을 사용하여 열려 있는 파일 설명자를 최종 프로그램에 전달합니다 webroot/.

s6에서는 도구 이름이 다르지만 비슷한 구조를 사용합니다(예:s6-tcpserver6-socketbinder오히려tcp-socket-listen) 재시작 논리는 다르게 처리됩니다. s6에는 서비스 관리자가 필요하지 않습니다. 원래 daemontools처럼 그냥 실행할 수 있습니다.s6-supervise서비스를 호출하기 위해 직접:

s6-감독 ./helpcovid/service/

주요 요점은 systemd를 사용하지 않는 것이 나쁜 데몬 디자인에 대한 변명이 될 수 없다는 것입니다(실제로 좋은 데몬 디자인 원칙).유래훨씬 오래된 비시스템 메커니즘) 및 청취 소켓에 대한 열린 파일 설명자를 전달하는 메커니즘이 단순한 시스템 이상에 적용되고 사용될 수 있다는 것입니다.

체계화된

위의 프로그램은 실제로 systemd에서 변환되었습니다.소켓 유닛그리고서비스 단위내가 빨리 던진 것. 다음 파일을 사용하여 systemd에서 사용자별 서비스를 설정하는 방법을 보여줍니다 ~/.config/systemd/user/.

# helpcovid.socket
[Unit]
Description=Starynkevitch helpcovid listening socket
[Socket]
ListenStream=50002
Accept=No
[Install]
Wanted-By=default.target
# helpcovid.service
[Unit]
Description=Starynkevitch helpcovid service
[Service]
Environment=LC_ALL=fr_FR.UTF-8
Restart=always
RestartSec=5
ExecStart=/home/basile/dev/helpcovid/work/helpcovid ${flags}
WorkingDirectory=/home/basile/dev/helpcovid/test
#This has no meaning for systemd.
EnvironmentDirectory=env

이것은 와 같은 것으로 제어됩니다 systemctl --user start helpcovid.socket.

systemd의 세계에서는 이러한~이다구성 파일. 사용자가 TCP 포트 번호를 변경하고 싶습니까? 사용자가 ListenStream=설정을 변경합니다. 로캘 설정을 위해 중복된 추가 환경 변수가 필요하지 않습니다. 사용자는 LC_ALL표시된 방식으로 실제(또는 무엇이든) 변수를 설정합니다.

벌채 반출

로깅은 서비스 관리에서도 처리됩니다. nosh 도구 세트 및 s6 방식은 파이프를 통해 표준 출력 및 표준 오류를 , 등을 실행하는 보조 서비스에 공급하는 것 cyclog입니다 s6-log. systemd는 journalctl --user읽는 데 사용하는 중앙 집중식 systemd 저널의 사용자 부분에 로그 출력을 기록합니다 .

귀하의 프로그램

std::clog귀하의 프로그램은 표준 오류에 기록하고 , 표준 환경 변수를 읽기 위해 호출하고, 메커니즘을 처리하는 코드를 가지고 있어야 setlocale()합니다 . 마지막으로 systemd와 함께 제공되는 이식 불가능한 도우미 함수 라이브러리부터 다른 사람들의 이식 가능한 작업에 이르기까지 다양한 선택 사항이 있습니다.NULLLISTEN_FDS

모든 TCP 포트 번호 구문 분석 코드, 불안정하고 위험한 PID 파일 코드, 그리고 이러한 방식으로 제거할 수 있는 코드보다 삽입할 코드가 확실히 훨씬 HELPCOVID_LOCALE적습니다 --locale. ☺

추가 읽기

관련 정보