LINE2023.04.12systemctlコマンドはsystemdやサービスマネージャの状態を確認でき、制御を行うことができます。systemdはLinuxでのinitシステムの一つで、多くのLinuxディストリビューションではデフォルトで利用されています。systemdはユニットファイルを利用して、サービスの制御をします。ユニットファイルを自作することもできますが、インストールしたパッケージのサービスを利用する場合、基本的にsystemdのユニットファイルもインストールされるので、そのユニットファイルを利用して、systemctlコマンドでsystemdに対してそのサービスを起動させたり、自動起動の設定を行なったりできます。get-defaultはデフォルトのターゲットを確認することができます。デフォルトのターゲットはマシンが起動するときに始めに読み込まれるsystemdのユニットファイルになります。基本的に最初にデフォルトのターゲットで設定されているのはシステムサービスではgraphical.targetまたはmulti-user.targetであり、GUI環境ではgraphical.targetで、CUI環境ではmulti-user.targetになっていることが多いです。get-defaultgraphical.target.targetファイルはユニットをグループ化したり、ユニットの同期ポイントとして利用されます。graphical.targetは"Requires="でmulti-user.targetを依存関係として同時に起動するように要求して、"After="でユニットの起動順としてmulti-user.targetの後にgraphical.targetが起動するようにされています。rescue.targetAllowIsolate=yessystemdにはユーザーのログイン時に起動するユーザーサービスのためのデフォルトのターゲットも存在します。これは--userをつけることで確認できます。こちらはデフォルトの設定だとdefault.targetとなっています。statusはsystemdによって管理しているサービスの状態を確認することができます。以下の例はnginxのサービス状態を確認したものになっています。catはユニットファイルの内容を確認することができます。最初の一行目にそのファイルの場所がコメントのように追加されるのが特徴的です。showはユニット、ジョブ、マネージャのパラメータを表示できます。引数がない場合は、マネージャのパラメータを表示します。例では表示される項目が多いため、最初の3行を表示しています。helpはユニットファイルに設定されているドキュメントを開くことができます。manページが開きます。manページが開きます。startでサービスを起動できます。stopでサービスを停止できます。reloadは指定したサービスが利用している設定ファイルを再読み込みすることができます。nginxのnginx.confやApacheのhttpd.conf等の設定ファイルを再読み込みできます。enableはサービスの自動起動を出来るようにします。自動起動を設定するとLoadedの単純にdisabledになっている部分がenabledに変更されます。(dead)自動起動の設定について、ユニットファイルのInstallセクションのWantedByの項目でsystemdに対してその項目と同時に起動するように要求します。nginxはUnitセクションにAfterが設定されているため、自動起動をするときはそのタイミングまで起動を待ちます。startを行う必要があります。enableとはほぼ逆のコマンドになり、サービスの自動起動の設定の解除を行うことができます。stopを行う必要があります。daemon-reloadはユニットファイルの再読み込みを行って、systemdで管理している依存関係ツリーを再構築します。systemdの管理しているユニットファイルとディスク上のユニットファイルに差が出ている場合に必要になります。systemdの管理しているユニットファイルとディスク上のユニットファイルに差が出る例として、自動起動させているユニットファイルを編集するとこのコマンドが必要になるでしょう。daemon-reloadを実行するように注意文が出ます。list-unitsはsystemdが現在メモリ内に持っているユニットのリストを確認できます。例では行数が多かったため、最初の3行だけ表示しています。list-timersもあります。list-dependenciesはユニットファイルの依存関係のリストを確認できます。引数を省略するとdefault.targetが指定されます。例では行数が多かったため、最初の3行だけ表示しています。├─apport.service--userをつけると違うユーザーサービスの別の依存関係を確認することができます。├─pipewire.serviceユニットファイルの検索パスユニットファイルの検索パスは以下のmanページで確認できます。/usr/lib/systemd/user/*123~/.config/systemd/user/*/etc/systemd/user/*/usr/lib/systemd/user/*かもしれません。ユニットファイルを作成してユーザーサービスを起動ここでは試しにシステムサービスではなくユーザーサービスを作成してみます。単純なpythonプログラムのサービスを起動させるユニットファイルを作成して、その後、自動起動の設定を追加して行いたいと思います。pythonプログラムは起動時の時間を覚えておき、5秒ごとに起動時までの経過した時間を表示する単純なプログラムになっています。自動起動を行わないサービスの作成まず自動起動を行わないユニットファイルを作成してみます。作成する場所は~/.config/systemd/userとし、ファイル名はmyapp-sleep-print.serviceとします。program[Service]Type=simpleExecStart=/home/ubuntu/myapp/sleep_print.pyサービスに利用するプログラムを作成pythonプログラムの方は以下のようになります。プログラムを作成した後は実行権限を付与することを忘れないようにしましょう。保存している場所は~/myappになり、ファイル名はsleep_print.pyになります。起動するプログラムは上のExecStartのパスと合わせましょう。ExecStartでパスを書く場合は基本的にフルパスである必要があります。flush=True)標準出力はsystemdで起動された場合、デフォルトではsystemdのロギングサービスのjournaldに渡されます。簡単にプログラムの気になる点を解説します。・print関数のflush=Trueは、文字の出力をバッファリングせずに即時に出力するために入れています。flush=Trueがないと文字の出力はバッファリングされ、journaldのログを確認しているときにプログラムの動作のタイミングと文字の出力の動作のタイミングが異なる感じになり、期待したタイミングで文字が出力されなくなる場合があります。・signalの部分は、systemdがサービスを停止する場合、デフォルトではsystemdがそのサービスに対して、SIGTERMが送り、さらにその後にSIGKILLが送るそうですが、pythonプログラムはSIGTERMが送られるとtry-finallyのfinally部分を実行せずにプロセスを終了するそうなので、SIGTERMのシグナルをキャッチしたら、自分でプログラムを終了するような形にしてfinally部分が動作するようにしています。print関数のflush=Trueが面倒なときは以下のようにprint関数をオーバーライドしてもいいかもしれません。myapp-sleep-print.serviceで起動できます。myapp-sleep-print.serviceで停止することができます。statusを見ると以下のようなログを見ることができます。myapp-sleep-print.serviceとするとリアルタイムでログを確認することができます。自動起動の設定Installセクションを追加します。ユーザーサービスなので、WantedByにdefault.targetを指定します。これがシステムサービスならば、graphical.targetやmulti-user.target等を指定するかもしれませんが、ユーザーサービスではそれらのシステムサービスのユニットファイルを指定できません。program[Service]Type=simpleExecStart=/home/ubuntu/myapp/sleep_print.py[Install]WantedBy=default.target補足として、default.targetはユーザーサービスでユーザーログイン時に始めに読み込まれるユニットファイルになります。enableで自動起動を設定します。(dead)ログアウトを行なって、再度ログインを行うと起動していることが確認できます。最後に、今回試しに作ったサービスを停止し、また、このサービスは特に何も役に立たないので、自動起動の設定を解除して終わりにします。(dead)タイマーのユニットファイルを作成して定期的にサービスを実行タイマーのユニットファイルを作成すると定期的にサービスを実行することができます。システムサービスでもタイマーで定期的にサービスを実行できますが、ここでは、試しにユーザーサービスでタイマーのユニットファイルを利用してみます。タイマーで利用するサービスやプログラムを準備タイマーで定期的に実行させるサービスは以下のようなものです。program[Service]Type=simpleExecStart=/home/ubuntu/myapp/rand_print.pyまた、利用するプログラムは以下のようなものになります。myapp-time-print.serviceその出力結果をjournalctlで確認すると以下のような感じになります。312.03タイマーのユニットファイルを作成と起動の確認タイマーのユニットファイルは以下のようになります。10s[Timer]Unit=myapp-rand-print.serviceOnBootSec=5OnUnitActiveSec=10[Install]WantedBy=timers.targetOnBootSecでまずマシンが起動してから5秒後にタイマーがサービスを1回起動させます。過ぎていた場合はタイマーはすぐにサービスを起動させます。その後のOnUnitActiveSecでタイマーがサービスを起動させた後の10秒後にまたタイマーがサービスを起動させます。こちらも既に過ぎていた場合はすぐに起動になります。TimerセクションのUnitの指定はここでは必要ありませんが明示しています。これがない場合、タイマーが起動するサービスは同名のサービスのユニットファイルが指定されます。タイマーのユニットファイルが作成出来た後は、自動起動を有効にします。statusで確認すると起動していることが確認できます。10s.その後、ある程度時間が経過した後にjournalctlでログを確認すると以下のようなログを確認できます。785.68う~ん、微妙に精度が悪いですね。調べてみるとTimerセクションのAccuracySecでタイマーの精度を設定できるそうです。デフォルトでは1分毎になっているので今回のものではタイマーの定期実行する時間の設定が短すぎたようです。AccuracySecは電力消費を最適化するためにCPUのウェイクアップを抑えるために利用するそうです。今回は試しなのでこの時間精度の間隔を長くするのではなく、50msまで短くしたいと思います。startで起動させ、何十秒間待った後にjournalctlで確認してみます。524.79今度は良い感じのタイミングで定期的に実行しています。最後に、今回試しに作ったサービスを停止して自動起動の設定を解除して終わりにします。ArchWikiユニットファイルについては以下のmanページがあります。ファイルまたはファイルシステムの情報を確認statコマンドは、ファイルの情報やファイルシステムの情報を確認することができます。lsコマンドよりも詳しいファイル情報を確認したい場合などに利用します。素因数分解を行うfactorコマンドは数字を入力すると、その数字の素因数を計算して出力するコマンドです。唐突に数字を素因数分解するような場面に遭遇したら、このコマンドを利用してみてもいいかもしれません。ファイルをバイナリで表示するodコマンドは、ファイルをバイナリとして表示することができます。問題によって、ファイルのバイナリを確認することで解決することもあります。空のディレクトリを削除するrmdirコマンドは空のディレクトリを削除するコマンドです。空のディレクトリ以外を削除する方法は、rmコマンドの-Rオプションによる再帰的な削除があります。コメントをキャンセルメールアドレスが公開されることはありません。※サイト次回のコメントで使用するためブラウザーに自分の名前、メールアドレス、サイトを保存する。上に表示された文字を入力してください。Linuxコマンド.NET.。