무엇밖의체계

무엇밖의체계

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

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

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

나는 다른 사람들과 함께 발전한다코로나19를 도와주세요, Linux용 C++17로 코딩된 다중 스레드 GPLv3+ 웹 애플리케이션 소프트웨어입니다.

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

구현하고 싶다다음 무한 루프git cloned 파일 트리 에서 .

  • git pull
  • make
  • .dll 을 실행할 ./helpcovid -D -T2때 stderr과 stdout은 모두 파일로 리디렉션됩니다 .
  • sleep 5

그리고무한반복.

꼭 써보고 싶어요예약 된 일들일하거나 atd어쩌면batch

더 좋은 방법이 있나요 systemd?

저에게 이메일을 보내주세요.[email protected]

답변1

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

systemd 없이 동일한 작업을 수행할 수 있는 다른 도구 세트가 있습니다. 물론 systemd를 사용하는 것도 작동합니다.반품사용자별 전용 서비스를 설정하세요.

벌써 2020년이네요. 불안정하고 위험한 PID 파일 메커니즘을 사용하는 새로운 프로그램을 작성할 이유가 없습니다. PID 파일 코드를 작성할 필요가 없습니다.

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

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

무엇밖의체계

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

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

helpcovid/service/start그리고 helpcovid/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-supervision./helpcovid/service/

너무 자세히 설명하지는 않겠습니다. 주요 요점은 systemd를 사용하지 않는 것이 잘못된 데몬 디자인에 대한 변명이 되지 않는다는 것입니다(사실 좋은 데몬 디자인 원칙은시작 시간이전의 비시스템 메커니즘) 및 청취 소켓 전달을 위해 파일 설명자를 여는 메커니즘은 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는 중앙 집중식 systemd 로그의 사용자 섹션을 사용자가 journalctl --user읽을 수 있는 로그 출력으로 채웁니다.

귀하의 프로그램

프로그램은 로그인 std::clog(즉, 표준 오류)하고, 표준 환경 변수를 읽기 위해 호출하고, 해당 메커니즘을 처리할 코드가 있어야 setlocale()합니다 . 결국 systemd와 함께 제공되는 이식 불가능한 도우미 라이브러리부터 다른 이식 가능한 유사한 라이브러리에 이르기까지 다양한 옵션이 있습니다.NULLLISTEN_FDS

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

추가 읽기

관련 정보