systemd - ExecStopなしでサービスを定義し、「失敗」なしで停止できます。

systemd - ExecStopなしでサービスを定義し、「失敗」なしで停止できます。

私はCentOS 7を使用しており、Kafkaスタンドアロンプ​​ロデューサー(ファイルコネクタ)をサービスとして始めたいと思います。コマンドは次のとおりです。

/opt/kafka/bin/connect-standalone.sh /opt/kafka/config/connect-standalone.properties /opt/kafka/config/connect-file-source.properties

そして明らかに停止コマンドはありません。通常、Ctrl+Cフォアグラウンドプロセスで停止します。

しかし、テストした結果、複数のプロセス(Zookeeper、Kafkaサーバー、Kafkaプロデューサー、Storm jarなど)を実行するために複数のターミナルコンソールセッションを開くことが非常に退屈であることを発見し、ZookeeperとKafkaサーバーをサービスに変更しましたstop。しかし、この場合はそうではありません。

systemctl start kafka-producer試してみましたが、systemctl stop kafka-producerサービスがfailed状態に入り、停止しませんでした。サービスを削除し、デーモンを再ロードしてから、手動で切り替える必要がありました。

kafka-producer.service:

[Unit]
Description=Kafka Producer
After=network.target

[Service]
Type=simple
ExecStart=/opt/kafka/bin/connect-standalone.sh /opt/kafka/config/connect-standalone.properties /opt/kafka/config/connect-file-source.properties
Restart=on-abort

[Install]
WantedBy=default.target

コマンドなしでサービスを操作する方法はありますかExecStop

答え1

通常、シェルでCtrl + Cを使用してプロセスを停止するとSIGINT(割り込み信号)がプロセスに送信されます。 (望むよりman signal)

systemdがデフォルトで(終了信号)に設定されたプロセスを送信せずにプロセスを停止しよExecStop=うとするとプロセスの応答を待ち、期限内に停止できない場合、systemdは単にプロセスを強制終了する信号を送信します。 。 systemdの動作は変更することができます(参照:KillSignal=SIGTERMSIGKILLKillSignal=man systemd.kill)。

KillSignal=SIGINTあなたの場合は、通常シェルで使用されるCTRL + Cをシミュレートするために追加します。プロセスがこの信号を捕捉して応答することを知っていますが、SIGTERMにどのように応答するのかわかりません。

[Service]
Type=simple
ExecStart=/opt/kafka/bin/connect-standalone.sh /opt/kafka/config/connect-standalone.properties /opt/kafka/config/connect-file-source.properties
KillSignal=SIGINT
Restart=on-abort

答え2

HDP 2.6.4とKafka 0.10.1をインストールした後、スクリプトは次のことを報告します。

/usr/hdp/2.6.4.0-91/kafka/bin$ ./connect-standalone.sh
USAGE: ./connect-standalone.sh [-daemon] connect-standalone.properties

オプションをデーモンランの属性として使用してください-daemon

これはあなたに可能ですか?

関連情報