スクリプトをデーモン化する一般的な方法が何であるかわかりません。たとえば、オンラインで検索したところ、コンピューターで毎秒時間をチェックするpythonスクリプトを作成しようとした場合、systemdを使用して起動して次に、Pythonで、タイマーを使用して無限ループ内にスクリプトを記述します。
これは私にはあまり意味がなく、デーモン化の良い方法のようにも思えません。 systemdで行うのは、起動時にスクリプト(および任意のスクリプト)を実行するために使用することだけなので、systemd自体はあまり便利ではないようです。スクリプトを間違ってデーモン化している可能性があると思うので、systemdを使用してpythonスクリプトをデーモンプロセスに変換するためのより良い方法を知っていますか?
ありがとう
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で使用して、ユニット名とともに説明情報を表示することを目的としています。説明には、エンドユーザーにとって何かを意味する名前を含める必要があります。 「Apache2Webサーバー」が良い例です。悪い例は、「高性能軽量HTTPサーバー」(一般的すぎる)または「Apache2」(Apacheを知らない人にとっては具体的すぎて意味がない)です。
このサービスユニットのプロセス起動タイプを設定します。シンプル、フォーク、ワンショット、dbus、通知、アイドルのいずれか。
Simpleに設定されている場合(Type =もBusName =も指定されていないが、ExecStart =が指定されている場合のデフォルト)、ExecStart =で構成されたプロセスがサービスのメインプロセスであることが期待されます。このモードでは、プロセスがシステム上の他のプロセスに機能を提供する場合、デーモンが起動する前にその通信チャネルをインストールする必要があります(たとえば、systemdによってセットアップされたソケット、ソケットのアクティブ化を介して)。systemdはすぐにフォローアップを開始します。ユニット。
このサービスの開始時に実行される引数付きのコマンド。値は、以下で説明するルールに従って0個以上のコマンドラインに分割されます(以下の「コマンドライン」のセクションを参照)。
このサービスファイルは、起動時にコマンド/usr/bin/check-time.py
を実行するだけです。コマンドが終了した場合、コマンドが実行を継続している限り、「アクティブ」と見なされます。
このサービスファイルはどの程度役に立ちますか?まあ、それほどではありません。それが行う唯一のことは、通常のフルパスの代わりにsystemctl start check-time.service
を使用してpythonスクリプトを実行できるようにすることですが、便利な追加オプションが豊富にあります。
WantedBy 起動時にサービスを開始する場合は、WantedBy=
をデフォルトのターゲットに設定します。
Restartsystemd
が「always」や「on-failure」など、サービスを自動的に再起動するタイミングを決定します
ハードウェア使用の制限、プロセスの実行に使用するユーザー、環境変数の設定、依存関係の設定など、文字通り何百もの他のオプション。 systemd
は、単に物事をラップできるという理由だけでなく、提供するすべての追加機能に役立ちます。
何を求めているのかわからない。 Systemdはinitシステムなので、起動時にプロセスを実行するのが仕事です。
編集:システム実行中のサービスを一覧表示するには:
systemctl list-units --type service