スクリプトをデーモン化する一般的なアプローチが何であるかよくわかりません。たとえば、オンラインで検索し、コンピュータで毎秒時間を確認するためにPythonスクリプトを作成しようとすると、systemdを使用して起動し、Pythonでスクリプトを作成してタイマーでループを終了することしか考えられませんでした。 。
これは私にとってあまり意味がなく、守るのに非常に良い方法ではありません。私がsystemdにすることは、起動時にスクリプト(およびすべてのスクリプト)を実行することだけなので、systemd自体はあまり役に立たないようです。私のスクリプトデーモンが間違っているようですが、systemdを使用してPythonスクリプトをデーモンに置き換えるより良い方法は何ですか?
ありがとう
ベストアンサー1
systemd
すべてを含むわけではありません。これは解決策ではありません。すべて問題がありますが、それはあなたにたくさん問題を解決するのに役立つツールです。これらのツールは使用方法に応じて便利です。
非常に基本的なサービスファイルを見てみましょう。check-time.service
(参考/usr/lib/systemd/system/
として参照用にある他のサービスファイルを使用してこのファイルを手動で作成しました。)
[Unit]
Description=Checks the time every second
[Service]
Type=simple
ExecStart=/usr/bin/check-time.py
サービスファイルは、次に属するか、/usr/lib/systemd/system/
次/etc/systemd/system/
のように生成されます。systemd
一行ずつ
[*]
セクションのタイトル。これはただ一緒にグループ化されたガイドラインです。マニュアルページで、どのディレクティブが属する場所への参照を見つけることができますsystemd
。
[単位]部分
[提供する]部分
単位を記述する自由形式の文字列です。これは、UIで説明情報とデバイス名を表示するために使用されます。説明には、エンドユーザーに意味のある名前を含める必要があります。 「Apache2 Webサーバー」が良い例です。悪い例は、「高性能軽量HTTPサーバー」(あまり一般的ではない)または「Apache2」(あまりにも具体的でApacheを知らない人には意味がありません)です。
このサービス単位のプロセス開始タイプを構成します。シンプル、フォーク、ワンショット、dbus、通知またはアイドルのいずれかです。
simpleに設定すると(Type =またはBusName =が指定されていないがExecStart =が指定されている場合はデフォルト)、ExecStart =で構成されたプロセスはサービスの基本プロセスになると予想されます。このモードでプロセスがシステム内の他のプロセスに機能を提供する場合は、デーモンが起動する前に適切な通信チャネルをインストールする必要があります(たとえば、ソケットのアクティブ化によってsystemdによってソケットが確立されます)。 systemd は後続のジョブを直ちに開始します。単位。
このサービスを開始したときに実行するパラメーターを含むコマンド。値は、以下の規則に従ってゼロ個以上のコマンドラインに分割されます(以下の「コマンドライン」セクションを参照)。
一般化する
/usr/bin/check-time.py
サービスファイルは起動時にのみコマンドを実行します。コマンドが終了すると、「死んだ」と見なされ、実行が継続される限り「アクティブ」と見なされます。
このサービスファイルはどのくらい便利ですか?まあ、あまり。それがする唯一のことは、systemctl start check-time.service
一般的なフルパスの代わりにPythonスクリプトを実行できるようにすることですが、他にも便利なオプションがたくさんあります。
便利なオプション
手配者起動時にサービスを開始するには、デフォルトのWantedBy=
ターゲットを設定してください。
再起動systemd
「常に」や「失敗した場合」など、サービスを自動的に再起動する時期を決定します。
ハードウェアの使用制限、プロセスの実行に使用するユーザー、環境変数の設定、依存関係の設定など、文字通り何百もの異なるオプションがあります。systemd
コンテンツをラップできるだけでなく、提供されるすべてのアドインにも役立ちます。