web-dev-qa-db-ja.com

systemdを使用してデーモンを作成する方法は何ですか?

スクリプトをデーモン化する一般的な方法が何であるかわかりません。たとえば、オンラインで検索したところ、コンピューターで毎秒時間をチェックするpythonスクリプトを作成しようとした場合、systemdを使用して起動して次に、Pythonで、タイマーを使用して無限ループ内にスクリプトを記述します。

これは私にはあまり意味がなく、デーモン化の良い方法のようにも思えません。 systemdで行うのは、起動時にスクリプト(および任意のスクリプト)を実行するために使用することだけなので、systemd自体はあまり便利ではないようです。スクリプトを間違ってデーモン化している可能性があると思うので、systemdを使用してpythonスクリプトをデーモンプロセスに変換するためのより良い方法を知っていますか?

ありがとう

1
Goldname

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によって使用されます


1行ずつ

[*]セクションヘッダー。これらは、ディレクティブをグループ化するだけです。どのディレクティブが属するかについての参照は、systemdのマニュアルページにあります。

[ユニット] セクション

[サービス] セクション

[インストール] セクション

説明

単位を説明する自由形式の文字列。これは、UIで使用して、ユニット名とともに説明情報を表示することを目的としています。説明には、エンドユーザーにとって何かを意味する名前を含める必要があります。 「Apache2Webサーバー」が良い例です。悪い例は、「高性能軽量HTTPサーバー」(一般的すぎる)または「Apache2」(Apacheを知らない人にとっては具体的すぎて意味がない)です。

タイプ

このサービスユニットのプロセス起動タイプを設定します。シンプル、フォーク、ワンショット、dbus、通知、アイドルのいずれか。

Simpleに設定されている場合(Type =もBusName =も指定されていないが、ExecStart =が指定されている場合のデフォルト)、ExecStart =で構成されたプロセスがサービスのメインプロセスであることが期待されます。このモードでは、プロセスがシステム上の他のプロセスに機能を提供する場合、デーモンが起動する前にその通信チャネルをインストールする必要があります(たとえば、systemdによってセットアップされたソケット、ソケットのアクティブ化を介して)。systemdはすぐにフォローアップを開始します。ユニット。

ExecStart

このサービスの開始時に実行される引数付きのコマンド。値は、以下で説明するルールに従って0個以上のコマンドラインに分割されます(以下の「コマンドライン」のセクションを参照)。


概要

このサービスファイルは、起動時にコマンド/usr/bin/check-time.pyを実行するだけです。コマンドが終了した場合、コマンドが実行を継続している限り、「アクティブ」と見なされます。

このサービスファイルはどの程度役に立ちますか?まあ、それほどではありません。それが行う唯一のことは、通常のフルパスの代わりにsystemctl start check-time.serviceを使用してpythonスクリプトを実行できるようにすることですが、便利な追加オプションが豊富にあります。


便利なオプション

WantedBy 起動時にサービスを開始する場合は、WantedBy=をデフォルトのターゲットに設定します。

Restartsystemdが「always」や「on-failure」など、サービスを自動的に再起動するタイミングを決定します

ハードウェア使用の制限、プロセスの実行に使用するユーザー、環境変数の設定、依存関係の設定など、文字通り何百もの他のオプション。 systemdは、単に物事をラップできるという理由だけでなく、提供するすべての追加機能に役立ちます。

4
Centimane

何を求めているのかわからない。 Systemdはinitシステムなので、起動時にプロセスを実行するのが仕事です。

編集:システム実行中のサービスを一覧表示するには:

systemctl list-units --type service
0
mrc02_kr