レイアウト: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環境で直接新しいスクリプトを作成してコピーすることができます。