クラッシュまたは再起動後にLinuxサービスを自動的に開始するように構成する方法-パート1:実際の例

前書き

このチュートリアルでは、クラッシュまたはサーバーの再起動後に自動的に再起動するようにシステムサービスを構成する方法を示します。

この例ではMySQLを使用していますが、Nginx、Apache、または独自のアプリケーションなど、サーバーで実行されている他のサービスにこれらの原則を適用できます。

このチュートリアルでは、最も一般的な3つのinitシステムについて説明しているため、必ずディストリビューション用のinitシステムに従ってください。 (多くのディストリビューションは複数のオプションを提供するか、代替のinitシステムをインストールできます。)

  • * System V *は古いinitシステムです:

  • Debian 6およびそれ以前

  • Ubuntu 9.04およびそれ以前

  • CentOS 5およびそれ以前

  • * Upstart *:

  • Ubuntu 9.10からUbuntu 14.10(Ubuntu 14.04を含む)

  • CentOS 6

  • * systemd *は、ここで取り上げられている最新のディストリビューションの初期化システムです。

  • Debian 7およびDebian 8

  • Ubuntu 15.04以降

  • CentOS 7

バックグラウンド

実行中のLinuxまたはUnixシステムでは、多数のバックグラウンドプロセスがいつでも実行されます。 これらのプロセス-_services_または_daemons_とも呼ばれる-は、オペレーティングシステムにネイティブであるか、アプリケーションの一部として実行される場合があります。

オペレーティングシステムサービスの例:

  • リモート接続を許可する* sshd *デーモン

  • 印刷を制御する* cupsd *デーモン

アプリケーションデーモンの例:

  • * httpd * / * apache2 *はWebサーバーサービスです

  • * mongod *はデータベースデーモンです

これらのサービスは、ウェブサイト、メール、データベース、その他のアプリが常に稼働していることを確認するために継続的に実行されることになっています。

管理者として、Linuxサービスに次のことを求めています。

  • 失敗することなく継続的に実行する

  • システムが再起動またはクラッシュした後、自動的に起動します

しかし、これらのサービスが停止し、ウェブサイトやアプリが利用できなくなることがあります。

再起動は、さまざまな理由で発生する可能性があります。それは、計画的な再起動、パッチ更新の最後のステップ、予期しないシステム動作の結果などです。 クラッシュとは、プロセスが予期せず停止した場合、またはユーザーまたはアプリケーションの要求に応答しなくなった場合に発生することです。

この記事の目的は、クラッシュまたはリブート後でも、サービスを再び稼働させることです。

継続的な監視とアラートに代わるものはありませんが、Linuxサービスは、_init_システムとも呼ばれるサービス管理デーモンによる処理方法を変更することで、大部分が自己修復できます。

これを行う唯一の方法はありません。すべて特定のLinuxディストリビューションとそれに付属するサービス管理デーモンに依存します。 多くの一般的なオペレーティングシステムのデフォルトの初期化システムは、上記の概要に示されています。

目標

この2部構成のチュートリアルでは、システムの再起動またはクラッシュ時にLinuxサービスを自動的に開始するように構成する方法を説明します。

このシリーズの第1回では、3つの異なる初期化(初期化)モードでそれを行う方法について簡単に説明します。

  • System V init(クラシックinitとも呼ばれる)

  • 新興企業

  • systemd

Part 2、コマンドを実行した理由と、それらがバックグラウンドでどのように機能するかを説明します。 スタートアップスクリプト、重要なファイル、各initメソッドの構成パラメーターについて説明します。 パート2の多くの議論は理論的に思えるかもしれませんが、基本を理解するための有用な参考資料となります。

パート1では、自動再起動を設定する実際的な側面のみを取り上げます。

前提条件

このチュートリアルを実行するには、それぞれが少なくとも* 1 GB *のRAMを備えた多数のDigitalOcean Dropletsを作成する(または独自のLinuxサーバーを作成する)必要があります。 ドロップレットの作成の詳細については説明しませんが、詳細についてはhttps://www.digitalocean.com/community/tutorials/how-to-create-your-first-digitalocean-droplet-virtual-serverをご覧ください。 [ここに]。

例では異なる分布を使用します。

  • Debian 6 x64(この古いOSはSystem V initシステムのデモに必要です)

  • Ubuntu 14.04 x64(Upstartの場合)

  • CentOS 7 x64(systemd用)

  • 各サーバーでsudoユーザーを設定する必要があります。 sudo権限の仕組みを理解するには、このDigitalOcean sudoアクセスの有効化に関するチュートリアルを参照してください。

*このチュートリアルのコマンド、クエリ、設定を実稼働Linuxサーバーで実行しないでください。*テストの一環としてサービスを中断するため、ライブサーバーに問題が発生することは望ましくありません。

System Vによるサービスの自動開始

ここで説明した最も古いinitシステムであるSystem V initで議論を始めましょう。

  • Debian 6およびそれ以前

  • Ubuntu 9.04およびそれ以前

  • CentOS 5およびそれ以前

System Vでは、NginxやMySQLなど、インストールできるほとんどの標準アプリケーションは、デフォルトで*再起動後に起動します*が、デフォルトでは*クラッシュ後に起動しません*。 それらはすでに `+ / etc / init.d +`に独自のinitスクリプトが付属しています。

カスタムアプリケーションの場合は、独自の初期化スクリプトを作成し、独自にサービスを自動的に開始できるようにする必要があります。

独自のinitスクリプトを作成することはこの記事の範囲外ですが、必要に応じて、既存のサンプルスクリプトを参照して独自のスクリプトを作成できます。 System Vは、initスクリプトにBashを使用します。

System Vの自動開始チェックリスト

このセクションは、サービスが自動的に開始するように設定されていることを確認するためのクイックリファレンスです。

構成チェックリスト

  • サービスの機能的なBash initスクリプトが `+ / etc / init.d / service +`にあることを確認してください

  • + update-rc.d +`コマンドを使用してサービスを有効にします(またはCentOSシステムの場合は `+ chkconfig +):

 sudo update-rc.d  enable
  • これにより、次のようなシンボリックリンクが `+ / etc / rc2.d +`に作成されます(これを手動で作成しないでください)。

 lrwxrwxrwx 1 root root  15 Jul 31 07:09 S02mysql -> ../init.d/

また、ディレクトリ `+ / etc / rc3.d `から ` / etc / rc5.d +`からのリンクも表示されることに注意してください。 _runlevels_について説明するときに、これらの数値の詳細をご覧ください。

  • このサービスの `+ respawn `行を ` / etc / inittab +`ファイルの最後に追加します。 一般的な例を次に示します。

/ etc / inittab

   :2345:respawn:
  • サービスを停止してから開始します。

 sudo service  stop
 sudo service  start
  • サーバーを再起動します。

 sudo reboot

テスト

これらが機能していることをテストするには、次のことができます。

  • サーバーを再起動し、サービスが起動していることを確認します

  • プロセス番号を検索:

 ps -ef | grep
  • プロセスを強制終了します。

 sudo kill -9
  • 5分待ってから、サービスがバックアップされていることを確認します

ステップ1-Debian 6ドロップレットへの接続

次に、MySQLを使用した実用的な例を見ていきます。

DigitalOceanコントロールパネルから、1 GBのRAMを持つ* Debian 6.0 x64 *ドロップレットを作成します。

ドロップレットが初期化されたら、SSHを使用してサーバーに接続します(WindowsユーザーはPuTTYなどのツールを使用して接続できます)。

ssh @

次の手順では、アカウントにsudo特権があることを前提としています。

ステップ2-MySQLのインストール

テストサービスとしてMySQLを使用します。 次のコマンドを実行して、MySQLサーバーをインストールします。

sudo apt-get install mysql-server -y

以下に示すようなグラフィカル画面が表示され、新しいルートパスワードを求められます。 それを提供する:

image:https://assets.digitalocean.com/articles/auto-restart-part-1/LDNF8JU.jpg [MySQLのルートパスワードを提供]

次のプロンプトでパスワードを繰り返します。

image:https://assets.digitalocean.com/articles/auto-restart-part-1/qrsnj7W.jpg [プロンプトでルートパスワードを繰り返す]

「+ ENTER」を押して確認します。

MySQLがインストールされると、行がスクロールします。 インストールが完了したら、次のコマンドを実行してインストールを強化します。

mysql_secure_installation

これにより、現在のルートパスワードが要求されます。 同じパスワードを保持するには、「+ N 」を押します。 次に、「 Y 」を押して匿名ユーザーを削除し、リモートルートログインを無効にして、テストデータベースを削除します。 最後に、「 Y +」を押して特権テーブルをリロードします。

これでMySQLのインストールが完了しました。

サービスが実行されているかどうかを確認するには、次のコマンドを実行します。

service mysql status

出力には数行の情報が表示され、そのうちの1行にはMySQLサービスが実行されている時間(稼​​働時間)が表示されます。

Output/usr/bin/mysqladmin  Ver 8.42 Distrib 5.1.73, for debian-linux-gnu on x86_64

. . .

Uptime:         4 days 18 hours 58 min 27 sec

Threads: 1  Questions: 18  Slow queries: 0  Opens: 15  Flush tables: 1  Open tables: 8  Queries per second avg: 0.0.

ステップ3-再起動後に自動起動するようにMySQLを構成する

デフォルトでは、MySQLは再起動後に起動するようにすでに設定されています。

`+ / etc / rc2.d `ディレクトリにMySQLのinitスクリプトへのこのシンボリックリンクが表示されるはずです。 これらのシンボリックリンクを手動で作成しようとしないでください。サービスを有効または無効にするには、「 update-rc.d +」コマンドを使用します。

ls -l /etc/rc2.d
Outputlrwxrwxrwx 1 root root  15 Jul 31 07:09 S02mysql -> ../init.d/mysql

サービスのデフォルトのランレベルディレクトリの下に `+ S +`スクリプトがある限り、initはサーバーの起動時にサービスを開始します。

したがって、MySQLが実行されているはずです。 次に、起動時に自動起動することを確認します。 次のコマンドでマシンを再起動します。

sudo reboot

サーバーがオンラインに戻ったら、SSHで接続します。

`+ service mysql status`コマンドを再度実行します。 繰り返しますが、サービスは実行中として表示されます。 つまり、オペレーティングシステムの起動時にサービスが自動的に開始されます。

ただし、すべてのサービスがこのようになるわけではありません。 そのような場合、自動再起動のためにサービスを手動で構成する必要があります。 Debianの場合、 `+ update-rc.d +`コマンドを使用すると、ブート時に自動的に開始されるサービスを追加(または削除)できます。

MySQLサービスを無効にして、自動開始のために再度有効にする方法を見てみましょう。 このコマンドを実行して、MySQLを無効にします。

sudo update-rc.d mysql disable

テストするには、サーバーを再起動します。

sudo reboot

SSHを使用してサーバーに接続します。

MySQLクライアントツールを使用してMySQLへの接続を試行します。

mysql -u root -p

次のメッセージが表示されます。

OutputERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

サービスを再度有効にします。

sudo update-rc.d mysql enable

出力は次のようになります。

Outputupdate-rc.d: using dependency based boot sequencing

起動時にサービスを自動開始するように有効にしても、サービスが停止しても自動的に開始されないことに注意してください。 MySQLを起動するには、次のコマンドを実行します。

sudo service mysql start

ステップ4-クラッシュ後に自動起動するようにMySQLを構成する

サービスが再び実行されたので、クラッシュ後に自動的に開始されるかどうかを見てみましょう。 System Vでは、デフォルトでは自動的に起動しません。

プロセスを突然強制終了してクラッシュをエミュレートします。 次のコマンドを実行してプロセスIDを見つけます。

ps -ef | grep mysql

出力は次のようになります。

Outputroot           1  0 07:21 pts/0    00:00:00 /bin/sh /usr/bin/mysqld_safe
mysql       1167  0 07:21 pts/0    00:00:00 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --user=mysql --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/run/mysqld/mysqld.sock --port=3306
root      1293  1167  0 07:21 pts/0    00:00:00 logger -t mysqld -p daemon.error
root      1384  1123  0 07:21 pts/0    00:00:00 grep mysql

MySQLを実行する主なプロセスは、「+ mysqld_safe 」と「 mysqld 」です。 ` mysqld_safe `は ` mysqld +`の親プロセスです。

この例では、それぞれプロセスID 1167と1292を持っていることがわかります。 それらのプロセス番号は、上の赤で強調表示されています。

`+ kill -9 +`コマンドでクラッシュをエミュレートしましょう。 必ず独自のプロセスIDを使用してください。

sudo kill -9
sudo kill -9

サービスの状態を確認します。

sudo service mysql status

出力には、サービスが停止したことが示されます。

OutputMySQL is stopped..

サービスがクラッシュしたので、どのようにしてサービスを起動しますか? もちろん再起動できますが、それは手動のプロセスです。再起動は自動的に行われます。 クラッシュ後にMySQLを自動再起動するには、 `+ / etc / inittab`ファイルを編集する必要があります。

`+ / etc / inittab +`ファイルについては第2部で詳しく説明しますが、ここでは、起動時にSystem V initが読み取る最初のファイルであることを理解しましょう。

とりわけ、 `+ / etc / inittab +`は、クラッシュした場合のプロセスの動作を決定します。 一部のプロセスでは、サービスを再生成することを意図しています。 MySQLがこれらのサービスに含まれていることを確認する必要があります。 最初にコピーを作成しましょう。

sudo cp /etc/inittab /etc/inittab.orig

テキストエディタで `+ / etc / inittab +`を開きます。

sudo nano /etc/inittab

ファイルの最後に、次の行を追加します。

/ etc / inittab

ms:2345:respawn:/bin/sh /usr/bin/mysqld_safe

ここで何をしているのでしょうか?

さて、 `+ / etc / inittab `ファイルにコマンドを入れて、クラッシュしたときに ` mysqld_safeプロセス+`を_respawn_します。 4つのフィールドがあり、それぞれがコロン(:)で区切られています。

  • `+ ms:+`最初の2文字はプロセスの_id_を指定します。

  • 2345: 2番目のフィールドは、適用対象の_runlevels_を指定します。 この場合、ランレベル2、3、4、および5用です。

  • + respawn:+ 3番目のフィールドは_action_を指定します(サービスを再生成しています)

  • + / bin / sh / usr / bin / mysqld_safe +:最後に、4番目のフィールドは_process_(実行するコマンド)です

パート2で `+ / etc / inittab +`ファイルに戻り、クラッシュ後のMySQLの自動起動にどのように役立つかを確認します。 ここでは、ファイルを保存してエディターを終了します。

サービスを再度開始します。

sudo service mysql start

サーバーを再起動して、変更を有効にします。

sudo reboot

ここで、コマンドを繰り返してプロセス番号を見つけ、プロセスを強制終了し、 `+ ps -ef | grep mysql + `。

  • 5分間待機*してからコマンドを実行します。

sudo service mysql status

今回は、クラッシュ後にMySQLが自動的に起動したことがわかります。

それでおしまい! MySQLは、サービスのクラッシュまたはシステムの再起動後に自動的に起動します。

Upstartによるサービスの自動開始

Upstartは別のinitメソッドで、Ubuntu 6で最初に導入されました。 Ubuntu 9.10でデフォルトになり、後にRHEL 6とその派生製品に採用されました。 GoogleのChrome OSもUpstartを使用しています。

  • Ubuntu 9.10からUbuntu 14.10(Ubuntu 14.04を含む)

  • CentOS 6

Ubuntuの現在のLTSバージョン(執筆時点では14.04)で強力になっていますが、systemdを支持してどこでも段階的に廃止されています。これについては前のセクションで説明します。

Upstartはシステムサービスの処理においてSystem Vよりも優れており、理解も容易です。 ただし、チュートリアルのこの部分ではUpstartについて詳しく説明しません。 DigitalOceanにはhttps://www.digitalocean.com/community/tutorials/the-upstart-event-system-what-it-is-and-how-to-use-it[Upstartの非常に良いチュートリアル]がありますコミュニティ。

今日は、主にUpstart構成ファイルに焦点を当て、それらを使用してサービスを自動開始する方法を確認します。

Upstartは構成ファイルを使用してサービスを制御します。 ファイルは `+ / etc / init +`ディレクトリの下にあります。 ファイルには、_stanzas_と呼ばれる読みやすいセクションを含むプレーンテキストコンテンツが含まれています。 各スタンザは、サービスのさまざまな側面とその動作を説明します。

デフォルトでは、インストールできるNginxやMySQLなどのほとんどの標準アプリケーションは、*再起動後に起動*し、デフォルトでは*クラッシュ後に起動*するため、この作業を行うために何もする必要はありません。 それらは既に `+ / etc / init +`に独自のinitスクリプトが付属しています。

カスタムアプリケーションの場合は、これを自分で設定する必要があります。 独自のカスタムUpstartスクリプトを作成する方法については、https://www.digitalocean.com/community/tutorials/the-upstart-event-system-what-it-is-and-how-to-use-itをご覧ください前に参照した[Upstart入門チュートリアル]。

Upstartの自動起動チェックリスト

このセクションは、サービスが自動的に開始するように設定されていることを確認するためのクイックリファレンスです。

構成チェックリスト

  • サービスの機能的なUpstart initスクリプトが `+ / etc / init / .conf +`にあることを確認してください

  • `+ / etc / init / .conf `ファイルには、再起動後の自動起動を有効にするために、 ` start on runlevel [2345] +`のような行を含める必要があります

  • `+ / etc / init / .conf `ファイルには、クラッシュ後にサービスが再起動できるように、 ` respawn +`のような行も含める必要があります

  • サービスの*オーバーライドファイルがないことを確認してください: + / etc / init / .override +

(あなたまたは別の管理者が以前に作成した場合にのみ存在します)

  • サービスを停止してから開始します。

 sudo initctl stop
 sudo initctl start
  • サーバーを再起動します。

 sudo reboot

テスト

これらが機能していることをテストするには、次のことができます。

  • サーバーを再起動し、サービスが起動していることを確認します

  • プロセス番号を検索:

 ps -ef | grep
  • プロセスを強制終了します。

 sudo kill -9
  • 数秒以内に、サービスがバックアップされていることを確認します

ステップ1-Ubuntu 14.04ドロップレットへの接続

MySQLを実行するUbuntu 14.04サーバーを使用して、Upstartのデモを行います。

1 GBのRAMでドロップレットを作成し、ベースイメージとして* Ubuntu 14.04 x64 *を選択します。

SSHでサーバーに接続します(WindowsユーザーはPuTTyなどのツールを使用して接続できます)。

ssh @

次の手順では、アカウントにsudo特権があることを前提としています。

ステップ2-MySQLのインストール

次に、MySQLをインストールします。

次のコマンドを実行して、パッケージリストを更新します。

sudo apt-get update

MySQLサーバーをインストールします。

sudo apt-get install mysql-server -y

MySQLの新しいルートパスワードを作成し、プロンプトが表示されたら確認します。

インストールが完了したら、 `+ mysql_secure_installation +`コマンドを実行します:

mysql_secure_installation

Debianにインストールするときに以前に行ったのと同じ回答をプロンプトに提供します(前のセクションを参照)。

ステップ3-再起動後に自動起動するようにMySQLを構成する

デフォルトでは、MySQLは再起動後に自動的に起動します。 この方法で独自のサービスをセットアップできるように、その構成を確認すると便利です。

まず、MySQLサーバープロセスが実行されているかどうかを確認しましょう。

sudo initctl status mysql

次のような出力が表示されます。

Outputmysql start/running, process 2553

サーバーを再起動します。

sudo reboot

サーバーがオンラインに戻ったら、SSHを使用して再接続します。

MySQLのステータスを確認します。

sudo initctl status mysql

出力には、MySQLが自動的に開始されたことが示されます。 したがって、サービスを有効にするためにここで特別なことをする必要はありません。

`+ / etc / init / +`ディレクトリに独自のUpstartファイルを作成してサービスを手動で有効にする必要がある他のアプリケーションデーモンには当てはまらない場合があることに注意してください。

また、Upstartは、MySQLが再起動時に自動起動する必要があることをどのように認識しますか?

MySQLのUpstart initファイルを見てみましょう。 テキストエディターで `+ / etc / init / mysql.conf +`ファイルを開きます:

sudo nano /etc/init/mysql.conf

Upstartファイルは、Debianマシンで見たようなシェルスクリプトではありません。

MySQLの初期設定ファイルには、開始前および開始後イベント用のスクリプトブロックがあります。 これらのコードブロックは、mysqldプロセスが起動中または起動済みのときに実行するものをUpstartシステムに指示します。

ファイルの最初の10行を詳しく見てみましょう。

/etc/init/mysql.conf

...
description     "MySQL Server"
author          "Mario Limonciello <[email protected]>"

start on runlevel [2345]
stop on starting rc RUNLEVEL=[016]

respawn
respawn limit 2 5

MySQLはランレベル2、3、4、5で起動するはずであり、ランレベル0、1、6で実行するはずではないことがわかります。

ここで、Upstartデーモンのサービス起動動作を定義します。 `+ update-rc.d `または ` chkconfig `コマンドを使用したSystem Vとは異なり、Upstartではサービス構成ファイルを使用します。 私たちがしなければならないことは、 ` start +`スタンザを追加/変更することです。 パート2では、このファイルを使用して、MySQLサービスの有効化と無効化がこのファイルにどのように影響するか、およびその逆を確認します。

`+ respawn +`ディレクティブはクラッシュ後にサービスを再起動するため、次のステップでそれらについて説明します。

ステップ4-クラッシュ後に自動起動するようにMySQLを構成する

まだ `+ / etc / init / mysql.conf +`を開いておく必要があります。

`+ respawn +`ディレクティブは一目瞭然です。MySQLがクラッシュすると起動します。 これはデフォルトですでに有効になっています。

その後のディレクティブはより興味深いものです。+ respawn limit + `ディレクティブは、秒単位で指定された間隔で、クラッシュしたサービスの再起動をLinuxが試行する回数を規定します。 この場合、最初の引数( `+ 2 +)は試行回数であり、2番目の引数( + 5 +)は間隔です。 このしきい値内でサービスが正常に起動(再起動)しない場合、サービスは停止状態のままになります。 サービスが継続的にクラッシュしている場合は、システム全体の安定性に影響を与えるよりも、サービスを無効にする方が適切であるため、この正常なデフォルトの動作です。

今のところ、変更を加えずにテキストエディタを終了します。

これまで見てきたように、デフォルトではMySQLはクラッシュ後に自動的に復帰するようにも設定されています。

これをテストするには、サービスPIDを確認しましょう。

sudo initctl status mysql

システムの新しいPID(再起動後)は次のようになります。

Outputmysql start/running, process

テストケースのプロセスIDを書き留めます。 次に、独自のプロセス番号を使用して、 `+ kill -9 +`コマンドでプロセスを強制終了してクラッシュをエミュレートします。

sudo kill -9

MySQLのステータスを今すぐ確認してください。 新しいPIDを使用して(即時または数秒以内に)実行する必要があります。

sudo initctl status mysql

この場合、新しいPIDは1552です。

Outputmysql start/running, process

必要に応じて、再び殺すことができます。 毎回再び表示されます:

これは、 `+ mysql.conf `ファイルの ` respawn +`ディレクティブが原因で発生しています。

/etc/init/mysql.conf

respawn

MySQLにはデフォルトでクラッシュ後に再起動する機能がありますが、他のサービスの場合は、このディレクティブを手動でUpstartファイルに追加する必要があります。 繰り返しになりますが、パート2では、構成ファイルからクラッシュ動作を変更する方法を説明します。

systemdを使用したサービスの自動開始

systemdはLinuxの_system and service manager_であり、ほとんどの新しいLinuxディストリビューションの事実上の初期化デーモンになっています。

最初にFedoraに実装されたsystemdには、RHEL 7とその派生物であるCentOS 7が付属しています。 Ubuntu 15.04にはネイティブsystemdも同梱されています。 他のディストリビューションはsystemdを組み込んでいるか、まもなく発表します。

  • Debian 7およびDebian 8

  • Ubuntu 15.04

  • CentOS 7

systemdは、System Vコマンドおよび初期化スクリプトと下位互換性があります。

つまり、System Vサービスもsystemdの下で実行されます。 ほとんどのUpstartおよびSystem V管理コマンドは、systemdで動作するように変更されています。 だからこそ、System V initの_drop-in replacement_と呼ばれることがよくあります。

systemdを使用すると、NginxやMySQLなど、インストールできるほとんどの標準アプリケーションは、デフォルトで*再起動後に起動*し、デフォルトで*クラッシュ後に起動*するため、この作業を行うために何もする必要はありません。 それらはすでに `+ / etc / systemd / system +`に独自のinitスクリプトが付属しています。

カスタムアプリケーションの場合は、独自の初期化スクリプトを作成し、独自にサービスを自動的に開始できるようにする必要があります。 ここでは、カスタムinitスクリプトの詳細については詳しく説明しませんが、https://www.digitalocean.com/community/tutorials/how-to-use-systemctlでsystemdの詳細を読むことができます。 -systemd-services-and-unitsの管理[systemdの紹介記事]。

systemdの自動開始チェックリスト

このセクションは、サービスが自動的に開始するように設定されていることを確認するためのクイックリファレンスです。

構成チェックリスト

  • サービスの機能的なsystemd initスクリプトが `+ / etc / systemd / system / multi-user.target.wants / .service +`にあることを確認してください

  • サービスを有効にするには、 `+ systemctl +`コマンドを使用します。

 sudo systemctl enable .service
  • これにより、次のようなシンボリックリンクが `+ / etc / systemd / system / multi-user.target.wants / +`に作成されます(これを手動で作成しないでください):

 lrwxrwxrwx 1 root root 38 Aug  1 04:43 /etc/systemd/system/multi-user.target.wants/.service -> /usr/lib/systemd/system/.service

これにより、再起動後の自動起動が有効になります。

  • `+ / etc / systemd / system / multi-user.target.wants / .service `ファイルには、ファイルの ` [Service] `セクションの下に ` Restart = always +`のような行も含める必要があります。クラッシュ後にリスポーンするサービス

  • systemdデーモンをリロードしてから、サービスを再起動します。

 sudo systemctl daemon-reload
 sudo systemctl restart .service

テスト

これらが機能していることをテストするには、次のことができます。

  • サーバーを再起動し、サービスが起動していることを確認します

 sudo reboot
  • プロセス番号を検索:

 ps -ef | grep
  • プロセスを強制終了します。

 sudo kill -9
  • 数秒以内に、サービスがバックアップされていることを確認します

ステップ1-CentOS 7ドロップレットへの接続

CentOS 7とMySQLを使用して、systemdサービスを構成する方法を示します。

1 GBのRAMでドロップレットを作成し、ベースイメージとして* CentOS 7 x64 *を選択します。

SSHを使用してサーバーに接続します(WindowsユーザーはPuTTyなどのツールを使用して接続できます)。

ssh @

sudo特権を持つアカウントを使用していると想定しています。

ステップ2-MySQLのインストール

次のコマンドを実行して、MySQL Community Serverリポジトリをダウンロードしてインストールします。

sudo wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm
sudo rpm -ivh mysql-community-release-el7-5.noarch.rpm

MySQLサーバーをインストールします。

sudo yum install mysql-server -y

インストールが完了したら、mysqldサービスを開始します。

(これは、MySQLをDebianおよびUbuntuの下にインストールしたときと同じではないことに注意してください。 他のディストリビューションでは、MySQLは自動的に起動しました。)

また、 `+ systemctl +`と呼ばれる新しいsystemdコマンドを使用してサービスを制御しています:

sudo systemctl start mysqld

次に、 `+ mysql_secure_installation +`コマンドを実行します。

mysql_secure_installation

この場合、MySQLルートパスワードは空になるため、新しいパスワードを作成することを選択する必要があります。 他のプロンプトに対して、DebianまたはUbuntuでインストールしたときと同じ回答を提供します(詳細については、以前のDebianセクションを参照してください)。

ステップ3-再起動後に自動起動するようにMySQLを構成する

デフォルトでは、MySQLは再起動後に自動的に起動するように設定されています。 これがどのように機能するか見てみましょう。

`+ mysqld `デーモンがブート時に自動的に起動するように設定されているかどうかを確認するには、 ` is-enabled `オプションを指定して ` systemctl +`コマンドを実行します。

sudo systemctl is-enabled mysqld.service

結果は次のようになります。

Outputenabled

マシンを再起動しましょう。

sudo reboot

サーバーが復旧したら、SSHで接続します。

次のコマンドを実行して、サービスのステータスを確認します。

sudo systemctl status mysqld.service

出力には、サービスが実行されていることが示されます。

Outputmysqld.service - MySQL Community Server
  Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled)
  Active: active (running) since Fri 2015-07-31 21:58:03 EDT; 1min 52s ago
 Process: 662 ExecStartPost=/usr/bin/mysql-systemd-start post (code=exited, status=0/SUCCESS)
 Process: 625 ExecStartPre=/usr/bin/mysql-systemd-start pre (code=exited, status=0/SUCCESS)
Main PID: 661 (mysqld_safe)
...

サービスを無効にするには、次のコマンドを実行します。

sudo systemctl disable mysqld.service

これはサービスを停止しませんが、無効にします。 実際、出力はシンボリックリンクが削除されたことを示しています。

Outputrm '/etc/systemd/system/multi-user.target.wants/mysqld.service'
rm '/etc/systemd/system/mysql.service'

必要に応じて、サーバーを再起動し、MySQLサーバーが実行されているかどうかを再度テストして確認できます(実行されません)。

または、 `+ systemctl is-enabled`を再度実行します。 `+ disabled`の応答を取得する必要があります。

sudo systemctl is-enabled mysqld.service
Outputdisabled

サービスを再度有効にします。

sudo systemctl enable mysqld.service

出力には、再作成されるシンボリックリンクが表示されます。

Outputln -s '/usr/lib/systemd/system/mysqld.service' '/etc/systemd/system/mysql.service'
ln -s '/usr/lib/systemd/system/mysqld.service' '/etc/systemd/system/multi-user.target.wants/mysqld.service'

サービスは再起動後に自動的に開始されます。

ステップ4-クラッシュ後に自動起動するようにMySQLを構成する

次に、クラッシュ後に自動起動するようにMySQLがどのように構成されているかを確認します。

まず、エディターで `+ mysql.service`ユニットファイルを開きます(systemdサービスは設定にユニットファイルを使用することに注意してください)。

sudo nano /etc/systemd/system/multi-user.target.wants/mysqld.service

ファイルの最後に、再起動のディレクティブがあります。

/etc/systemd/system/multi-user.target.wants/mysqld.service

[Unit]
...

[Install]
...

[Service]
...
...

...

`+ Restart `パラメータの値は ` always +`に設定されます。 これは、クリーンまたはクリーンでない終了コードまたはタイムアウトでMySQLサービスが再起動することを意味します。

それがsystemdで自動再起動が定義される場所です。

Upstartの `+ respawn `ディレクティブと同様に、systemdの ` Restart +`パラメーターは、クラッシュした場合のサービスの動作を定義します。

すべてのsystemdサービスでこの機能がデフォルトで有効になっているわけではありません。クラッシュ後にサービスを起動するには、サービスユニットファイルの `+ [Service] `セクションの下にこの追加のディレクティブを追加するだけです。 セクションヘッダーが存在しない場合は、 ` [Service] +`ヘッダーも追加する必要があります。

クラッシュをエミュレートするには、最初にエディターを終了してから、MySQLプロセスIDを確認します。

sudo systemctl status mysqld.service
Outputmysqld.service - MySQL Community Server
  Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled)
  Active: active (running) since Fri 2015-07-31 21:58:03 EDT; 1h 7min ago
Main PID:  (mysqld_safe)
...

`+ kill -9 +`シグナルでこのプロセスを強制終了します。 この場合、メインPIDは661です。 PIDを独自のものに置き換えます。

sudo kill -9

ステータスを確認します。

sudo systemctl status mysqld.service

出力は、MySQLが新しいPIDで再起動したことを示します(この場合、新しいプロセスIDは11217です)。

Outputmysqld.service - MySQL Community Server
  Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled)
  Active: active (running) since Fri 2015-07-31 23:06:38 EDT; 1min 8s ago
 Process: 11218 ExecStartPost=/usr/bin/mysql-systemd-start post (code=exited, status=0/SUCCESS)
 Process: 11207 ExecStartPre=/usr/bin/mysql-systemd-start pre (code=exited, status=0/SUCCESS)
Main PID:  (mysqld_safe)
...
...

したがって、クラッシュした後でもサービスが起動することがわかります。

結論

チュートリアルのこの最初の部分では、System V、Upstart、およびsystemdサービスを再起動またはクラッシュ後に自動起動するように構成する方法を説明しました。

この動作を制御するファイル、構成パラメーター、およびコマンドも確認しました。

これは、より実践的な導入でした。 このシリーズの次回の記事では、概念と基本について詳しく説明します。

まだDropletsを削除しないでください-https://www.digitalocean.com/community/tutorials/how-to-configure-a-linux-service-to-start-でそれらに戻るので、それらを実行し続けてくださいクラッシュ後またはリブートパート2参照後に自動的に[次のパート]。

Related