Linuxがsystemdにサービス構成と自動再起動


レイアウト:POSTの
タイトル:Linuxの者にsystemdサービスの設定と自動再起動
DATE:2019年9月9日
タグ:Linuxの
---

Linuxがsystemdにサービス構成と自動再起動

0背景

Linux上で開発する場合、多くの場合、彼らのプログラムのサービスを行い、サービスがクラッシュした後、我々は実現の機能を簡単に紹介を行い、自動的に起動し、再起動するサービス、および自動再起動機能を実装する必要があり、実装は、Linuxシステムを使用することは非常に簡単ですsystemdに実現することができます

1 systemdにはじめに

歴史的に、Linuxの起動は、次のような、initプロセスを使用しています

$ sudo /etc/init.d/apache2 start

若しくは

$ service apache2 start

このアプローチは、2つの欠点があります。

まず、長い起動時間。initプロセスは、シリアルが完了したプロセスを開始するだけで、最初に起動され、次のプロセスを開始します。
第二に、スタートアップスクリプトが複雑。initプロセスはちょうどかかわらず、他のものの、起動スクリプトを実行します。このスクリプトは、多くの場合、スクリプトは非常に長くなりますさまざまな状況で、独自の契約を、必要とします。

これらの問題や出産を解決するためにsystemd。その設計目標は、システムの起動と管理のための完全なソリューションを提供することです。

Linuxの規則によると、文字dは、略語デーモン(デーモン)です。名前のsystemdに意味は、それがシステム全体の保護者になることです。その後は、initを必要としない、システムDを使用してください。システムDは、initdを置換プロセスの最初のシステム(PID = 1)、他のプロセスが、その子であるとなりました。

システム管理のためのsystemctl systemdにメインコマンド。ユーザーの場合、最も一般的に使用開始とユニット(メインサービス)を停止するには、以下のコマンドです。

- すぐにサービスを開始

$ systemctl start apache.service

- サービスを停止します

$ systemctl stop apache.service

- サービスを再起動

$ systemctl restart apache.service

- サービスは、すべての子プロセスを殺します

$ systemctl kill apache.service

- サービスプロファイルをリロード

$ systemctl reload apache.service

- すべての変更された設定ファイルをリロード

$ systemctl daemon-reload

- ユニットの基礎となるすべてのパラメータを表示

$ systemctl show httpd.service

- 単位の指定されたプロパティの値を表示

$ systemctl show -p CPUShares httpd.service

- 単位の指定されたプロパティを設定します。

$ systemctl set-property httpd.service CPUShares=500

この記事は、systemdにの使用は、あなたがにsystemdの基礎についての詳細を知りたい場合は、関連する情報にアクセスすることができ、導入されています

2サーバーサイドスクリプト

ここでは、サービスを実装するために使用するPHPスクリプトサービスserver.phpというを書きます

<?php
$sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
socket_bind($sock, '0.0.0.0', 10000);
for (;;) {
    socket_recvfrom($sock, $message, 1024, 0, $ip, $port);
    $reply = str_rot13($message);
    socket_sendto($sock, $reply, strlen($reply), 0, $ip, $port);
}

lsofコマンド実行後のポート占有率を表示するために使用することができます

lthpc@lthpc:~$ lsof -i:10000
COMMAND   PID  USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
php     40446 lthpc    3u  IPv4 37381218      0t0  UDP *:10000 

NCクライアントのテストを使用して命令シミュレーション

$ nc -u 127.0.0.1 10000
Hello, world!
Uryyb, jbeyq!

3サービスを作成し
、次の使用は、サービスを作成するためにsystemdサービスプロファイルを作成します/etc/systemd/system/rot13.service

[Unit]
Description=ROT13 demo service
After=network.target
StartLimitIntervalSec=0
 
[Service]
Type=simple
Restart=always
RestartSec=1
User=ltpc
ExecStart=/usr/bin/env php /path/to/server.php
 
[Install]
WantedBy=multi-user.target

注意すべきいくつかのポイントがありますが、サービスは自動的に無制限の回を再起動することを可能にするために、以下の設定を追加する必要があります

StartLimitIntervalSec=0

Restart=always

RestartSec=1

設定ファイルの意味の特定のパラメータは、参照文書

設定したら、サービスを開始するには、次のステートメントを実行することができます

$ systemctl start rot13

実行した後、彼はROT13と呼ばれるサービスを開始し、ステータスビューのサービスの状態を使用することができます

lthpc@lthpc:~/workspace_zong/tcptest$ systemctl status rot13
● rot13.service - ROT13 demo service
   Loaded: loaded (/etc/systemd/system/rot13.service; disabled; vendor preset: enabled)
   Active: active (running) since 一 2019-10-28 11:25:43 CST; 1min 28s ago
 Main PID: 44532 (php)
    Tasks: 1
   Memory: 5.2M
      CPU: 24ms
   CGroup: /system.slice/rot13.service
           └─44532 php /home/lthpc/workspace_zong/tcptest/server.php
 
10月 28 11:25:43 lthpc systemd[1]: Started ROT13 demo service.

自動的にブートを開始するには、次の文を実行

$ systemctl enable rot13

同様に、あなたはNC命令をシミュレートクライアントのテストを使用することができ、我々はサービスが正常な動作を開始したことを見ることができます!

4自動再起動
自動的に通常の再起動できるかどうかをテストするには、我々は、手動でサービスプロセスが開始されて殺し、その後、あまりにも再起動プロセスを示す、プロセスIDがPID番号を交換することが見出されている表示、および-u 127.0.0.1 10000の命令テストはまだNCを呼び出すことができます使用しますサービス

$ systemctl status rot13 | grep PID
 Main PID: 44532 (php)
$ sudo kill 44532
$ systemctl status rot13 | grep PID
 Main PID: 44255 (php)

入力に注意してくださいsystemctl stop rot13サービスが再起動されていない場合に完全に変更するには、コマンドを停止し、それを起動し、直接実行し、パラメータを変更する必要があるので、もし、


サービスの設定を書きます

vim /lib/systemd/system/website.service

[Unit]
Description=website
After=network.target
 
[Service]
Type=forking
ExecStart=/home/monitor/website/start.sh
ExecReload=/home/monitor/website/restart.sh
ExecStop=/home/monitor/website/shutdown.sh
 
[Install]
WantedBy=multi-user.target

対応開始を書き、スクリプトを停止する
には:

vim /home/monitor/website/start.sh
#!/bin/sh
export JAVA_HOME=/usr/java/jdk1.8.0_144
export PATH=$JAVA_HOME/bin:$PATH
 
nohup java -jar /home/monitor/website/demo-0.0.1-SNAPSHOT.jar &

閉じます:

vim /home/monitor/website/shutdown.sh
#!/bin/sh
ps -ef | grep demo-0.0.1-SNAPSHOT.jar | grep -v grep | awk '{print $2}' | xargs kill -9

再起動します。

vim /home/monitor/website/restart.sh
#!/bin/sh
export JAVA_HOME=/usr/java/jdk1.8.0_144
export PATH=$JAVA_HOME/bin:$PATH
 
ps -ef | grep demo-0.0.1-SNAPSHOT.jar | grep -v grep | awk '{print $2}' | xargs kill -9
nohup java -jar /home/monitor/website/demo-0.0.1-SNAPSHOT.jar &

実行を許可:

chmod +x start.sh shutdown.sh restart.sh

発売以来構成
のブート:systemctl enable website

起動します。systemctl start website

閉じます:systemctl stop website

再起動します。systemctl restart website

ビューのステータス:systemctl status website

再検証サービス構成を変更します。systemctl daemon-reload

共通systemctlエラーコード
|コード| DESC |
|:------ |:------------------------------- -------------------------- |
| 0 |コマンドが正常に完了|
| 1 |一般的な原因不明のエラー|
| 2 |悪用シェルコマンド|
| 126 | |コマンドが実行されない
| 127 |コマンドを見つけることができなかった|
| 128個の|無効出口パラメータ|
| 128 + X |重大なミスのLinux信号x |
| 130 | Linuxは信号重大なエラー2、そのコマンドSIGINT(Ctrlキー+ C)終了|
| 203 |欠落が識別スクリプトの実行|
| 255 |クロスボーダーの終了ステータス|

備考
:このようshスクリプトを実行しているとして、次のエラー報告
/ binに/ SH ^ Mを:悪い通訳:そのようなファイルやディレクトリはありませんが
原因スクリプトファイルに窓にLinuxのエディタにコピーされ、各行の最後には窓の下にテキストを編集するために引き起こされます\ n個の\ R、およびLinuxの\ nされ、
溶液:
入力端子-iセッド'S / \ R&LT // $' daemon.sh
セッド-i 'S / \ R&LT // $'はdaemon.shうブランクに置き換えmake-all-linux-project.sh \ rの列の端部、前記エラーdaemon.shスクリプト。
このエラーを回避するには、LinuxまたはLinux環境で直接新しいスクリプトを作成してコピーすることができます。

おすすめ

転載: www.cnblogs.com/nxzblogs/p/11755972.html