目次
Systemd は Linux システムおよびサービス マネージャーであり、SysV および LSB 初期化スクリプトと互換性があります。Systemd には次の機能があります。
- 積極的な並列化機能
- ソケットと D-Bus アクティベーションを使用してサービスを開始する
- Linux cgroup を使用してプロセスを追跡し、デーモンをオンデマンドで起動します。
- システム状態のスナップショットと復元をサポート
- マウントと自動マウントポイントを維持する
- トランザクションの依存関係に基づいて適切に設計されたサービス制御ロジックを実装する
systemctl コマンドは、systemd を管理するための主要なツールであり、SysVinit サービスと chkconfig コマンドの機能を 1 つのツールに結合しており、これを使用してサービスを永続的に、または現在のセッションに対してのみ有効または無効にすることができます。
ユニット型
Systemd は、システム リソースとサービスを表すユニットを管理します。次のリストは、systemd が管理できるユニットのタイプを示しています。
- サービス システム上のサービス (サービスの開始、再起動、停止など)
- ソケット サービスに関連付けられたネットワークソケット
- デバイスは systemd を使用してデバイスを特別に管理します
- systemd によって管理されるマウント ポイントをマウントする
- automount の開始時に自動的にマウントされるマウント ポイント
- swap システム上のスワップ領域
- target 他のユニットの同期ポイント。通常は起動時に有効なサービスを開始するために使用されます。
- path パスに基づいてアクティブ化するパス。たとえば、パスが存在するかどうかなど、パスの状態に基づいてサービスを開始できます。
- timer は、別のユニットをアクティブにするタイマーをスケジュールするために使用されます。
- スナップショット 現在の systemd 状態のスナップショット。通常、systemd に一時的な変更を加えた後にロールバックするために使用されます。
- スライスは、Linux 制御グループ ノード (cgroup) を通じてリソースを制限します。
- スコープ systemd バス インターフェイスからの情報。通常、外部システムプロセスを管理するために使用されます
systemctl の一般的なコマンド
systemctl start chronyd #启动
systemctl stop chronyd #停止
systemctl restart chronyd #重启
systemctl status chronyd #查看 unit 状态
systemctl enable chronyd #设置 unit 开启启动
systemctl disable chronyd #取消 unit 开机启动
systemctl is-enabled chronyd #查看 unit 是否开机启动
# 重新加载 unit 的配置文件,每次修改了 unit 的配置文件后,需要执行以下命令重新加载 unit 的配置文件
systemctl daemon-reload
systemctl mask chronyd #屏蔽 unit,屏蔽后 unit 无法启动
systemctl unmask chronyd #取消屏蔽
# 更多命令可通过 systemctl --help 或 man systemctl 来查看
ユニット構成ファイル
sshdサービスのユニット設定ファイルは以下の通りで、主に[ユニット]、[サービス]、[インストール]の3つの部分に分かれています。
[root@vm03 ~]# cat /usr/lib/systemd/system/sshd.service
[Unit]
Description=OpenSSH server daemon
Documentation=man:sshd(8) man:sshd_config(5)
After=network.target sshd-keygen.service
Wants=sshd-keygen.service
[Service]
Type=notify
EnvironmentFile=/etc/sysconfig/sshd
ExecStart=/usr/sbin/sshd -D $OPTIONS
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartSec=42s
[Install]
WantedBy=multi-user.target
[ユニット]部分の詳細説明
このセクションで使用されるパラメータは、サービス タイプのユニットに限定されるものではなく、他のタイプのユニットにも共通です。これらのパラメータの完全なリストとその説明については、コマンド man systemd.unit を実行するか、systemd.unit の中国語マニュアルを参照してください 。
注: [unit] ブロック内の各パラメーターの後にスペースで区切られたリストを指定できます。
- 説明: 現在のユニットの説明
- ドキュメント: ドキュメントのアドレス。次のタイプの URI のみを受け入れます: http://、https://、file:、info:、man:
- 必須: このユニットと他のユニットの間に強い依存関係があることを示します。このユニットがアクティブ化されると、ここにリストされているユニットもアクティブ化されます。依存するユニットの 1 つをアクティブ化できない場合、systemd はこのユニットを起動しません
- Wants: Requires と似ていますが、依存するユニットが起動に失敗しても、ユニットの継続的な動作には影響しない点が異なります。
- 後: 特定のサービスの後にユニットを開始する必要があることを示します。オプションは systemd.special 中国語マニュアルを参照できます。
- Before: 特定のサービスの前にユニットを開始する必要があることを示します。After フィールドと Before フィールドには起動シーケンスのみが関係し、依存関係は関係しません。
- BindsTo: Requires と同様に、指定されたユニットが停止すると、このユニットも停止します
- PartOf: Requires と同様に、指定されたユニットが停止または再起動されると、ユニットも停止または再起動されます。
- 競合: 指定されたユニットが実行中の場合、このユニットは実行できません。
- OnFailure: ユニットが障害状態になった場合、指定されたユニットをアクティブ化します。
【サービス】部分詳細説明
サービス固有のパラメータ
これらのパラメータを持つのはサービス タイプのユニットのみです。パラメータの完全なリストについては、 systemd.service 中国語マニュアル または systemd.serviceを参照してください。
- simple (デフォルト値): サービスはメイン プロセスによって開始されます。systemd は、サービスがすぐに開始されると考え、サービス プロセスはフォークしません。サービスが他のサービスを開始したい場合は、サービスがソケットでアクティブ化されていない限り、このタイプの開始を使用しないでください。
- forking: サービスはフォークとして開始され、その時点で親プロセスが終了し、子プロセスがメインプロセスになります。systemd は、サービス プロセスがフォークして親プロセスが終了すると、サービスが正常に開始されたと考えます。通常のデーモンの場合は、この起動方法がニーズを満たせないことが明らかでない限り、このタイプの起動を使用してください。このスタートアップの種類を使用する場合は、systemd がサービスのメイン プロセスを追跡できるように、PIDFile= も指定する必要があります。
- oneshot: シンプルに似ていますが、一度だけ実行され、Systemd は実行が完了するまで待機してから他のサービスを開始します。このオプションは、タスクを 1 つだけ実行し、すぐに終了するサービスに適しています。サービスプロセスが終了した後も systemd がサービスがアクティブであるとみなすように、同時に RemainAfterExit=yes を設定する必要がある場合があります。
- dbus: シンプルと似ていますが、D-Bus 信号を待った後に開始します。systemd は、指定された BusName が DBus システム バス上に存在する場合、サービスが準備完了であるとみなします。
- 通知: シンプルと同様に、Systemd は起動後に通知され、実行を継続します。
- idle: simple と似ていますが、他のすべてのタスクが実行されるまでサービスは開始されません。
RemainAfterExit: サービスのすべてのプロセスが終了した場合でもサービスが生きているとみなされることを指定するブール値。デフォルトは no です。
GuessMainPID: サービスのメイン PID を確実に決定できない場合に、systemd がサービスのメイン PID を推測するかどうかを指定するブール値。Type=forking が設定され、PIDFile が設定されていない限り、このオプションは無視されます。デフォルトは yes です。
PIDFile: このデーモンの PID ファイルを指す絶対ファイル名。このオプションは、Type=forking のサービスに推奨されます。Systemd は、サービスの開始後にデーモンのメイン プロセスの PID を読み取ります。Systemd はここで設定されたファイルには書き込みませんが、サービスのシャットダウン後にファイルを削除します。
BusName: このサービスに到達するための D-Bus バスの名前。このオプションは、Type=dbus のサービスに必要です
ExecStart: サービスの開始時に実行されるコマンドとパラメータ
ExecStartPre: サービスの開始前に実行されるコマンド
ExecStartPost: サービスの開始後に実行されるコマンド
ExecReload: サービスの再起動時に実行されるコマンド
ExecStop: サービスの停止時に実行されるコマンドとパラメータ
ExecStopPost: サービス停止後に実行されるコマンド
RestartSec: サービスを再起動するまでのスリープ時間 (秒単位)
TimeoutStartSec: サービスの開始を待つ時間 (秒単位)
TimeoutStopSec: サービスが停止するまでの待ち時間 (秒単位)
TimeoutSec: TimeoutStartSecとTimeOutshopSecの略称を同時に設定します
再起動:サービスプロセスの終了時、強制終了時、タイムアウト時にサービスを再起動するかどうかを設定します 設定可能な値は以下のとおりです。
- どのサービスも再起動されません。これがデフォルトです
- 成功時は、サービスプロセスが正常に終了した場合にのみ再起動します (終了コード 0)。
- on-failure は、サービス プロセスが異常終了した場合にのみ再起動します。いわゆる「異常終了」とは、終了コードが「0」ではないことを意味します。
- on-abnormal シグナルまたはタイムアウトによりプロセスが終了した場合に再起動します。
- on-watchdog ウォッチドッグがタイムアウトになったときに再起動する
- クリーンな終了ステータスとして指定されていないキャッチされなかったシグナルが原因でプロセスが終了した場合、中断時に再起動します。
- いつもいつも再起動する
環境: 環境変数を指定します。
KillMode: systemd がサービスを停止する方法を定義します。設定できる値は次のとおりです。
- control-group (デフォルト値): 現在の制御グループ内のすべての子プロセスが強制終了されます。
- プロセス: メインプロセスのみを強制終了します
- 混合: メインプロセスは SIGTERM シグナルを受信し、子プロセスは SIGKILL シグナルを受信します。
- none: プロセスは強制終了されず、サービスの停止コマンドのみを実行します。
プロセス実行環境
サービス、ソケット、マウント、およびスワップ ユニットによって共有され、プロセス実行環境の定義に使用される構成オプションを以下に示します。パラメータの詳細な説明については、コマンド man systemd.exec を実行するか、 systemd.execの中国語マニュアルを参照してください。
WorkingDirectory: プロセスの作業ディレクトリを設定します。
User=、Group: 実行中にプロセスによって使用されるユーザーとグループを設定します。これは、数値形式の UID/GID または文字列形式の名前として設定できます。
NoNewPrivileges: ブール値を受け取ります。サービスのすべてのプロセスと子プロセスが execve() 呼び出しを通じて新しいアクセス許可を取得できないことを示すには、yes に設定します。このオプションは、プロセスによる権限の昇格を防ぐ最も簡単かつ効果的な方法です。
SELinuxContext: プロセスの SELinux セキュリティ コンテキストを設定します。
プロセスのさまざまなソフト/ハード リソース制限を設定します。 LimitCPU=、LimitFSIZE=、LimitDATA=、LimitSTACK=、LimitCORE=、LimitRSS=、LimitNOFILE=、LimitAS=、LimitNPROC=、LimitMEMLOCK=、LimitLOCKS=、LimitSIGPENDING=、LimitMSGQUEUE=、LimitNICE=、LimitRTPRIO=、LimitRTTIME= 値には 2 つの表記法があります。単一値値とは、ソフト制限とハード制限を同じ値に設定することを意味します。コロンで区切られたソフト:ハード値は、それぞれソフト制限とハード制限を設定することを意味し (たとえば、LimitAS=4G:16G)、特別な値 infinity は制限なしを意味します。バイト単位のオプションの場合、基本 1024 K、M、G、T、P、E のサフィックスを使用できます (例: LimitAS=16G)。時間制限の場合、「ms」(ミリ秒)、「s」(秒)、「min」(分)、「h」(時間)、「d」(日)、「w」(週)、およびその他の明示的な時間単位の接尾辞を追加できます。
UMask: ファイル作成マスクを設定します。デフォルト値は 0022 です。
OOMScoreAdjust: メモリ不足により強制終了されるプロセスの優先度を設定します。-1000 (殺害を禁止) から 1000 (最初に殺害) までの整数値に設定できます。
環境: VAR=VALUE のスペース区切りリストを受け入れて、プロセスの環境変数を設定します。このオプションは、新しい変数を追加したり、既存の変数を変更したりするために複数回使用できます (同じ変数の最後の設定が優先されます)。空に設定すると、以前に設定されたすべての変数がクリアされます。注: (1) 文字列内では変数展開は実行されません (つまり、「$」には特別な意味はありません); (2) 値にスペースまたは等号が含まれる場合は、文字列の両側で二重引用符 (") を使用して区切る必要があります。例: Environment="VAR1=word1 word2" VAR2=word3 "VAR3=$word 5 6" は、3 つの変数 "VAR1"、"VAR2"、および "VAR3" が設定されていることを意味し、その値はは、「word1 word2」、「word3」、「$word 5 6」です。
EnvironmentFile:Environment= と似ていますが、このオプションがテキスト ファイルから環境変数の設定を読み取る点が異なります。ファイル内の空白行とセミコロン (;) またはポンド記号 (#) で始まる行は無視され、他の行の形式は VAR=VALUE のシェル変数割り当て構文に準拠する必要があります。行末のバックスラッシュ (\) は、シェル構文と同様に継続文字として扱われます。変数値にスペースを含める場合は、値の両端に二重引用符 (") を追加する必要があります。ファイルは絶対パスで表す必要があります (ワイルドカードを含めることができます)。ただし、パスにプレフィックス「-」を追加すると、存在しないファイルを無視できます。このオプションを複数回使用して、複数の異なるファイルから設定を読み取ることができます。空に設定されている場合は、以前にファイルから読み取られたすべての環境変数がクリアされることを意味します。ファイルを読み取るには、ファイルから読み取られた環境変数が、 Environment= で設定した名前と同じです。ファイルが読み取られる順序は、ユニット ファイルに出現する順序であり、同じ変数の場合は、最後に読み取られたファイルの設定が優先されます。
UnsetEnvironment: このユニットの特定の環境変数の設定を明示的に解除します。
StandardInput: プロセスの標準入力 (STDIN) を設定します。これは、null、tty、tty-force、tty-fail、data、file:path、socket、fd:name のいずれかに設定できます。このオプションのデフォルト値は null です。
StandardOutput: プロセスの標準出力 (STDOUT) を設定します。これは、inherit、null、tty、journal、syslog、kmsg、journal+console、syslog+console、kmsg+console、file:path、append:path、socket、fd:name のいずれかに設定できます。
StandardError: プロセスの標準エラー (STDERR) を設定します。値の範囲と意味は StandardOutput= と同じです。
StandardInputText、StandardInputData: 標準入力 (STDIN) を通じてプロセスに渡されるテキストまたはバイナリ データを設定します。これらのオプションは、StandardInput=data の場合にのみ意味があります。
LogLevelMax: このログ レベルに従って、このユニットによって生成されたログ メッセージをフィルタリングします。このログ レベルは、emerg (最も低いログ レベル、最も致命的なメッセージのみを表示)、alert、crit、err、warning、notice、info、debug (最も高いログ レベル、最も詳細なデバッグ メッセージを表示) のいずれかの syslog ログ レベルに設定できます。
プロセス環境変数
詳細な手順については、 systemd.exec 中国語マニュアルを参照してください。
$PATH: 実行可能ファイルのディレクトリ リスト (コロンで区切られた絶対パス)。この値は /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin に固定されています。
$LANG: ローカリゼーション設定。locale.conf(5) ファイル経由で設定可能
$USER、$LOGNAME、$HOME、$SHELL: ユーザー名、ユーザー名、ホーム ディレクトリ、ログイン シェル
$MAINPID: ユニットのメインプロセスの PID (特定できる場合)
プロセスを強制終了する方法
サービス、ソケット、マウント、スワップ、およびスコープの各ユニットには、プロセスを強制終了する方法に関する一連の構成オプションがあります。完全なパラメータの説明については、コマンド man systemd.kill を実行するか、systemd.kill 中国語マニュアルを参照してください 。
KillMode: ユニット停止時にプロセスを強制終了する方法を設定します。値の範囲は次のとおりです: control-group、process、mixed、none デフォルト値は control-group です。これは、ユニットの cgroup 内のすべてのプロセスを強制終了することを意味します (サービス ユニットの場合、ExecStop= アクションを最初に実行する必要があります)。
KillSignal: プロセスを強制終了する最初のステップで使用するシグナルを設定します。利用可能なすべてのシグナルについては、 signal(7) マニュアルで詳しく説明されています。デフォルトは SIGTERM シグナルです。systemd は、中断されたプロセスを完全に強制終了するために、このシグナルに無条件で SIGCONT シグナルを続けることに注意してください。
SendSIGHUP: 最初のステップで KillSignal= シグナルを送信した直後に、ユニットのすべてのプロセスに SIGHUP シグナルを送信するかどうか。これは主に、シェルなどのプロセスに接続が切断されたことを通知するために使用されます。デフォルトは「いいえ」です
SendSIGKILL: TimeoutStopSec= 時間が経過した後に残りのプロセスを強制終了するために SIGKILL または FinalKillSignal= シグナルを使用するかどうか。デフォルト値は「はい」です
FinalKillSignal: タイムアウトが発生し、SendSIGKILL= がオンになっている場合、シグナルが残りのプロセスに送信されます。サービスによって捕捉および処理できないシグナルに設定する必要があります (SIGTERM は適切ではありません)。開発者は、これを使用してコアダンプを生成し、最初の SIGTERM シグナルを受信したときにサービスが適切に終了しなかった理由を理解できます。これを行うには、LimitCORE= を設定し、FinalKillSignal= を SIGQUIT または SIGABRT のいずれかに設定します。このオプションのデフォルト値は SIGKILL です。
WatchdogSignal: ウォッチドッグ (WatchdogSec=) がタイムアウトしたときにサービスを終了するために使用されるシグナル。このオプションのデフォルト値は SIGABRT です。
プロセスリソース制御
スライス、スコープ、サービス、ソケット、マウント、およびスワップ ユニットは、プロセス リソースの使用量を制限するための構成オプションのセットを共有します。基本的に、これらのオプションは、Linux カーネルの cgroups 機能に依存して、プロセスのグループをツリー状の階層に編成し、許可されるさまざまなリソースを制限します。これらのパラメータの完全なリストとその説明については、コマンド man systemd.resource-control を実行するか、systemd.resource-control の中国語マニュアルを参照してください 。
[インストール]部分の詳細説明
[install] は、ユニットのインストール情報を定義します。設定のこの部分は、systemctl enable または systemctl disable が使用されている場合にのみ使用されます。この部分は、ユニットの実行中は説明されません。これは、ブート方法の設定と同等です。
このセクションで使用されるパラメータは、サービス タイプのユニットに限定されるものではなく、他のタイプのユニットにも共通です。これらのパラメータの完全なリストとその説明については、コマンド man systemd.unit を実行するか、systemd.unit の中国語マニュアルを参照してください 。
- エイリアス: 現在のユニットを使用してエイリアスを開始できます。ここにリストされている名前にはサービス ファイル名と同じサフィックス (つまりタイプ) が必要です。systemctl Enable を実行すると、これらの名前からユニット ファイル名へのシンボリック リンクが作成されます。
- RequiredBy: サービスが配置されているターゲットを示します。その値は 1 つ以上のターゲットです。systemctl が有効な場合、ユニットのシンボリック リンクは、/etc/systemd/system ディレクトリの下のターゲット名 + .required サフィックスで形成されるサブディレクトリに配置されます。
- WantedBy: サービスが配置されているターゲットを示します。その値は 1 つ以上のターゲットです。現在の systemctl が有効な場合、ユニットのシンボリック リンクは、/etc/systemd/system ディレクトリの下のターゲット名 + .wants サフィックスで形成されるサブディレクトリに配置されます。
- また、systemctl を有効または無効にすると、他のユニット リストも同時に有効化および無効化されます。
ターゲットの意味
Target の意味は、サービス グループ、つまりサービスのグループを意味し、WantedBy=multi-user.target は、ユニットが配置されている Target が multi-user.target (マルチユーザー モード) であることを意味します。
systemctl Enable を実行すると、ユニットが /etc/systemd/system/multi-user.target.wants ディレクトリにリンクされ、ブート機能が実現されるため、この設定は非常に重要です。
共通ユニット構成ファイル
# nginx的unit 配置文件
cat /usr/lib/systemd/system/nginx.service
[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/run/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/bin/sh -c "/bin/kill -s HUP $(/bin/cat /usr/local/nginx/run/nginx.pid)"
ExecStop=/bin/sh -c "/bin/kill -s TERM $(/bin/cat /usr/local/nginx/run/nginx.pid)"
[Install]
WantedBy=multi-user.target
# redis的unit 配置文件
[Unit]
Description=Redis data structure server
Documentation=https://redis.io/documentation
Wants=network-online.target
After=network-online.target
[Service]
ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf
LimitNOFILE=10032
NoNewPrivileges=yes
OOMScoreAdjust=-900
Type=notify
User=redis
Group=redis
[Install]
WantedBy=multi-user.target
# mysql的unit 配置文件
[Unit]
Description=mysql server
Documentation=https://dev.mysql.com/doc/refman/5.7/en/using-systemd.html
After=network.target
After=syslog.target
[Service]
User=mysql
Group=mysql
Type=forking
PIDFile=/usr/local/mysql/mysqld.pid
ExecStart=/usr/local/mysql/bin/mysqld --daemonize --pid-file=/usr/local/mysql/mysqld.pid $MYSQLD_OPTS
LimitNOFILE=5000
Restart=on-failure
[Install]
WantedBy=multi-user.target
# prometheus的unit 配置文件
[Unit]
Description=prometheus service
Documentation=https://prometheus.io/docs/prometheus/latest/management_api
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/prometheus/prometheus \
--config.file=/usr/local/prometheus/prometheus.yml \
--storage.tsdb.retention.time=92d \
--storage.tsdb.path=/usr/local/prometheus/data \
--web.listen-address=0.0.0.0:9090 \
--web.console.templates=/usr/local/prometheus/consoles \
--web.console.libraries=/usr/local/prometheus/console_libraries
#如果想要输出日志重定向到文件,可以按如下方式,注意此时就不能使用续行符了
#ExecStart=/bin/bash -ce "/usr/local/prometheus/prometheus --config.file=/usr/local/prometheus/prometheus.yml >> /var/log/prometheus.log 2>&1"
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
Restart=on-failure
[Install]
WantedBy=multi-user.target
# alertmanager的unit 配置文件
[Unit]
Description=alertmanager service
Documentation=https://prometheus.io/docs/alerting/latest/management_api
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/alertmanager/alertmanager \
--config.file=/usr/local/alertmanager/alertmanager.yml \
--storage.path=/usr/local/alertmanager/data \
--data.retention=120h \
--web.listen-address=0.0.0.0:9093
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
Restart=on-failure
[Install]
WantedBy=multi-user.target
# node_exporter的unit配置文件
[Unit]
Description=node_exporter
Documentation=https://github.com/prometheus/node_exporter
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/prometheus_exporter/node_exporter-1.1.2.linux-amd64/node_exporter \
--web.listen-address=0.0.0.0:9100 \
--web.telemetry-path=/metrics
ExecStop=/bin/kill -s TERM $MAINPID
Restart=on-failure
[Install]
WantedBy=multi-user.target
# redis_exporter的unit配置文件
[Unit]
Description=redis_exporter
Documentation=https://github.com/oliver006/redis_exporter
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/prometheus_exporter/redis_exporter-v1.25.0.linux-amd64/redis_exporter \
-redis.addr=localhost:6379 \
-redis.password=123456 \
-web.listen-address=:9121 \
-web.telemetry-path=/metrics
Restart=on-failure
[Install]
WantedBy=multi-user.target
# blackbox_exporter的unit配置文件
[Unit]
Description=blackbox_exporter
Documentation=https://github.com/prometheus/blackbox_exporter
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/prometheus_exporter/blackbox_exporter-0.19.0.linux-amd64/blackbox_exporter \
--web.listen-address=0.0.0.0:9115 \
--config.file=/usr/local/prometheus_exporter/blackbox_exporter-0.19.0.linux-amd64/blackbox.yml
ExecStop=/bin/kill -s TERM $MAINPID
ExecReload=/bin/kill -s HUP $MAINPID
Restart=on-failure
[Install]
WantedBy=multi-user.target
# mysqld_exporter的unit配置文件
[Unit]
Description=mysql_exporter
Documentation=https://github.com/prometheus/mysqld_exporter
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/prometheus_exporter/mysqld_exporter-0.13.0.linux-amd64/mysqld_exporter \
--config.my-cnf=/usr/local/prometheus_exporter/mysqld_exporter-0.13.0.linux-amd64/.my.cnf \
--web.listen-address=:9104 \
--web.telemetry-path=/metrics
Restart=on-failure
[Install]
WantedBy=multi-user.target
# systemd管理java进程
[Unit]
Description=question_api
Documentation=https://docs.oracle.com/javase/tutorial/deployment/jar/basicsindex.html
After=network.target
[Service]
Type=forking
SuccessExitStatus=143
ExecStart=/bin/sh -c "/usr/local/java/jdk1.8.0_201/bin/java -Xms2048m -Xmx2048m -jar /app/question_api/question_api_beta.jar --server.port=8080 >> /var/log/app/question_api.log 2>&1 &"
ExecStop=/bin/kill -s TERM $MAINPID
Restart=on-failure
[Install]
WantedBy=multi-user.target
# 配置项 SuccessExitStatus=143 是为了抑制stop时报错 Main process exited, code=exited, status=143/n/a
# 这是因为 java 程序在响应 SIGTERM 时不会并不会发回预期的退出状态
# 所以需要将退出代码 SuccessExitStatus=143 添加到 systemd 服务文件作为成功退出状态来抑制这种报错