何外のシステム

何外のシステム

この問題おそらく私がここで尋ねる質問に関連しているようです。

これは次の文脈でです。https://github.com/bstarynk/helpcovid/(Linux用GPLv3+ソフトウェア、現在2020年4月にリリース)ポジティブこれは特にLinux用に開発されたC ++マルチスレッドWebアプリケーションです。進行中のタスク2020年4月8日)

b-star-y.techLinux/Debian/Busterを実行しているホストでVPSをリースしています。

他の人と一緒に発展するコロナ19を助けてください、Linux用のC ++ 17でコーディングされたマルチスレッドGPLv3 + Webアプリケーションソフトウェア。

私は慣れていないsystemd、このホストのDebian / Busterが使用するか、docker

実装したいNext 無限ループ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。 ☺

追加読書

関連情報