Systemd:独自の.serviceおよび.targetを作成します

自宅のコンピューターでLinuxを入手し、新しいOSに落ち着くように急いでいます。 systemd initプロセスでインストールされました。 これは、この新しいツールの最初の紹介です。 私はラップトップを日常生活やプログラミングに使用しています。 コンピューターのリソースを無駄にしないために、作業プログラム(Apache2とMySQL)をしばらくの間使用したかったのです。 さらに、テストのために、MySQLデータベースの1つのコンテンツをハードドライブからRAM(tmpfs内)にアンロードするbashスクリプトを作成しました。これにより、テストがより高速に実行されます。 理論的には、次のように仕事を始めることができます。

systemctl start apache2.service systemctl start mysqld.service /root/scripts/mysqld-tmpfs start
      
      





そしてそれを終える:

 systemctl stop apache2.service systemctl stop mysqld.service /root/scripts/mysqld-tmpfs stop
      
      





しかし、私は「正しい」ことをしたかったのです。



何が欲しかった?



私は2つの目標を達成したかった:

  1. 私は2つのコマンド(Apacheの開始とmysqlの開始)を書くのが面倒でした。 両方のプログラムが常に同期してオフとオンになることを知っていました。 この操作を1つのチームで実行したかったのです。
  2. データベースがtmpfsにある間にコンピューターを再起動すると、問題が発生し、すべてのファイルが失われます。 もちろん、バックアップを行いましたが、不意にリブートするたびに手動で復元するにはあまりにも面倒でした。




私は何をしましたか?



その結果、Apache2とMySQLを1つのターゲットに結合しました。 これにより、1つのチームで両方のサービスを実行できました。 そして、mysqld-tmpfsスクリプトをsystemdのサービスとして宣言しました。 サービスであるため、システムが再起動またはその他の緊急事態に陥った場合、systemdはそれを正しく停止し、データベースはハードドライブに失われることなく保存されます。



サービスとは何ですか?



これは、バックグラウンドで実行され、有用な機能を提供するプログラムの一種です。 たとえば、Apache Webサーバー。 サービスを開始および停止できます。 一部のサービスは、特定のイベント(OSのロード、OSのアンロードなど)で自動的に開始および停止できます。 手動で開始/停止することもできます。 サービスは/etc/systemd/system/my-name.serviceファイルで宣言されます(接尾辞「.service」付き)。



ターゲットとは何ですか?



systemdのターゲットはopenRCのランレベルに非常に似ていますが、これらはまだ異なっています。 まず、ターゲットを使用すると、1つ以上のサービスを1つのユニットにグループ化できます。 サービスをターゲットにグループ化することにより、管理しやすくなります。 次に、systemdはイベントによってターゲットを自動的にオン/オフにします。 ターゲットの「包含」とは、結合するすべてのサービスの包含を意味します。 たとえば、systemdのデフォルトがmy-favorite.targetでターゲットがsystemdに設定されている場合、システムの起動時にsystemdにはmy-favorite.target内で宣言されているすべてのサービスが含まれます。 コンソールのある時点で、次のように入力できます。

 systemctl isolate my-another.target
      
      





my-another.targetのすべてのサービスがオンになり、my-another.target以外のすべてのサービスがオフになります。 これは、ランレベルをopenRCに切り替えることに非常に似ています。 ただし、systemdは複数のターゲットを含めることをサポートしています。 以下に例を示します。

 #   my-favorite.target      systemctl isolate my-favorite.target #      targets   1 target systemctl start my-another.target
      
      





これらのコマンドを実行した後、システムはmy-favorite.targetとmy-another.targetのサービスを結合します。



どうやってこれをやったの?



その結果、次のようなmysqld-tmpfs.serviceファイルを取得しました。

 Description=Mount a MySQL database into tmpfs. #  /root/scripts/tmpfs      ,     mysql .    mysql    ,  ,      : #Requires=mysqld.service #After=mysqld.service [Service] #   systemd,        1 . Man page    . Type=oneshot #      . ExecStart=/root/scripts/mysqld-tmpfs start #      . ExecStop=/root/scripts/mysqld-tmpfs stop #   systemd,     ,       .   ,   :          ,    , ..    . RemainAfterExit=yes
      
      





そして、このようなprogramming.targetファイルは次のとおりです。

 [Unit] Description=Working/Programming target Requires=mysqld.service Requires=apache2.service #       “Requires=another.service”,       .
      
      







問題は何でしたか?



programming.targetが停止したとき、何らかの理由で、基礎となるapache2.serviceとmysqld.serviceは停止しませんでした。 マニュアルページを適切に読んだ後、問題を発見しました:systemdはサービスを「怠”に」停止します-誰もサービスを開始する必要がなく、明示的に開始されなかったが、他のサービスの依存関係として、systemdは1つだけで停止します3つの状況:

  1. 他のサービスを開始しますが、その宣言では、サービスと競合することを示しています。
  2. Systemctlはsome-another.targetを分離するか、systemctlはthis.serviceを停止します。
  3. 私たちのサービスは、その宣言で怠itselfな方法ではなく、[Unit]セクションに次の行を追加することでアクティブな状態で停止するよう要求する場合があります:StopWhenUnneeded = true




「エイリアン」サービスの宣言は、/ etc / systemd / system / name-i-alter.service.d / *。confファイルを作成することで変更できます。 /etc/systemd/system/apache2.service/auto-stop.confと/etc/systemd/system/mysqld.service.d/auto-stop.confを作成して、そこにその行を追加しました。



私が出くわした別の問題は、systemdがシンボリックリンクをあまり好きではないということでした。 私は、/ etc、/ bin、/ usrなどのシステムディレクトリをローカルの重要な製品と「混乱させる」ことを大ファンにしていないので、最初に/etc/systemd/system/mysqld-tmpfs.serviceを試して/ root / scripts / mysqld-へのシンボリックリンクを作成しましたtmpfs.serviceファイル、つまり ファイル自体をルートユーザーのホームディレクトリに保存します。 しかし、systemctlチームは、このようなサービスでの作業を拒否して、あいまいなエラーを出しました。 systemdは、内部キッチンの特定の部分をシンボリックリンクで正確に実行し、内部キッチン(シンボリックリンク)とサードパーティの* .serviceファイル(シンボリックリンクでもある)を区別するのは「難しい」ことが判明しました。 /etc/systemd/system/mysqld-tmpfs.serviceからsymlinkを削除し、このファイルの内容をそこにコピーすることで、この問題を解決しました。 この問題の詳細については、 bugzilla.redhat.com / show_bug.cgi?id = 955379を参照してください。



結果



目標を達成しました。 営業日を開始する:

 systemctl start programming.target
      
      





プロジェクトでテストを実行する必要がある場合:

 systemctl start mysqld-tmpfs.service
      
      





データベースをtmpfsからハードドライブに分解したい場合(実際にはほとんどこれを行いませんが、データベースを1日だけtmpfsに残し、systemdをオフにすると、ハードドライブ用にtmpfsからディスマウントを開始します):

 systemctl stop mysqld-tmpfs.service
      
      





作業を終えて、作業プログラムを停止したい場合:

 systemctl stop programming.target
      
      







チートシート



systemdを使用する場合の有用性:





この記事がsystemdのマスタリングに役立つことを願っています。 私はそれをコンパクトにしようとしました、そして、私がさらなる質問を見落とすならば、コメントで尋ねてください!



All Articles