optionsを公開する必要があるシステムサービスを作成しようとしていますstart|stop|status|restart
。
現在のスクリプトは次のとおりです。
[Unit]
Description=Daemon to start ark server
After=network.target
[Service]
ExecStart=/etc/init.d/arkdaemon start
ExecStop=/etc/init.d/arkdaemon stop
Type=forking
[Install]
WantedBy=multi-user.target
カスタム状態コマンドを指定する方法が見つかりません。
方法があるようですが、どうですか?
答え1
Systemd はカスタム状態メッセージをサポートしていますが、以下は満たす必要があるいくつかの前提条件です。
- サービスの種類は次のとおりです。
notify
/run/systemd/notify
サービスはソケットまたはsystemd-notifyを呼び出して現在のサービス状態にsystemdを更新する必要があります。
参考までに、FedoraでApache HTTPDを確認できます(他のディストリビューションでも同じかもしれません)。
systemctl status httpd.service
● httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
Active: active (running) since Fri 2017-10-06 15:21:07 CEST; 18h ago
Docs: man:httpd.service(8)
Process: 14424 ExecReload=/usr/sbin/httpd $OPTIONS -k graceful (code=exited, status=0/SUCCESS)
Main PID: 4105 (httpd)
Status: "Total requests: 8; Idle/Busy workers 100/0;Requests/sec: 0.000118; Bytes served/sec: 0 B/sec"
Apacheのステータスレポートは次のように表示されます。要求の総数:予定あり/なしワーカー100/0
したがって、pid 4105を添付すると、定期的strace
にステータスアップデートを次に送信することがわかりますsystemd
。
sudo strace -f -p 4105
wait4(-1, 0x7ffcfab4a25c, WNOHANG|WSTOPPED, NULL) = 0
select(0, NULL, NULL, NULL, {tv_sec=1, tv_usec=0}) = 0 (Timeout)
socket(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC, 0) = 8
getsockopt(8, SOL_SOCKET, SO_SNDBUF, [212992], [4]) = 0
setsockopt(8, SOL_SOCKET, SO_SNDBUFFORCE, [8388608], 4) = 0
sendmsg(8, {msg_name={sa_family=AF_UNIX, sun_path="/run/systemd/notify"}, msg_namelen=21, msg_iov=[{iov_base="READY=1\nSTATUS=Total requests: 8"..., iov_len=110}], msg_iovlen=1, msg_controllen=0, msg_flags=0}, MSG_NOSIGNAL) = 110
close(8) = 0
wait4(-1, 0x7ffcfab4a25c, WNOHANG|WSTOPPED, NULL) = 0
転送されていることがわかります。準備=1\nSTATUS=総リクエスト数: 8...ソケットに接続/run/systemd/notify
おすすめブック
man systemd-notify
または公式文書。
答え2
optionsを公開する必要があるシステムサービスを作成しようとしています
start|stop|status|restart
。
あなたの最初の間違い。サービスユニットはスクリプトではありません。彼らはしません持つオプション。これらのオプションはsystemctl
コマンドごとに適用され、すべてのデバイスで同じです。
Centosの使用は標準ではないようだと気づきました。
2番目のエラーは3番目のエラーに関連しています。
私はDebian / Ubuntuの多くの問題を解決するためにPRをマージします。その後、Centosは別の初期化方法を使用するため、代替デーモンを作成する必要があります。
CentOSはいいえ反体制挨拶を除外します。 Ubuntuバージョン15、Debian 8、およびCentOS 7はすべてsystemdを使用し、すべて適切なsystemdサービスユニットが必要です。
ExecStart=/etc/init.d/arkdaemonを起動 ExecStop=/etc/init.d/arkdaemonを停止
4番目の間違いです。すべてをSystem 5rc
スクリプトに移動してサービスユニットを作成しないでください。ただし、DebianとUbuntuではすべてを掛けるので動作しません。後ろにユニットをサービスすることは、システム化された恐怖の家に入る恐ろしい概念です。 System 5スクリプトを見ると、rc
すべての誤った内容が表示されます。 — snappy grep 出力、ps
誤った使用sudo
減らす特権(代わりに得る該当する) - 適切なサービス管理者に連絡してこの問題を解決できます。
台無しにしないでください。 デーモンが実際にどのように実行されるかを理解するそして、それを説明するサービスユニットを作成します。
System 5 スクリプトはrc
with と動詞という名前のプログラムを呼び出します。したがって、一見すると、システム化されたサービスユニットも同じことを行う必要があると考えることができます。しかし、それが明らかになったarkmanager
start
stop
arkmanager
それ自体はい終わったらもっとあります。貧しい人のデーモン監督者はシェルスクリプトで書かれています(いつものように悪くても)。このスクリプトは同じゴミとそれ以上を行います。 grep の出力はプロセスを分岐する方法として (sic!) をps
使い、次に送ります。これを維持し、独自の(回転していない)ログファイルを維持し、デーモンを管理するときに、最初に端末に接続しないプログラムでハードワイヤードされたCSIシーケンス(sic!)を使用します。screen
SIGINT
あなたは別の恐怖を作るのに忙しいです。止まる
ある貧しい人のデーモンが他の人のデーモンを監督し、最終的に3screen
番目の一時的な監督者の身分を乱用するこの崩れている恐ろしい建物を剥がすと、基本的なサービス管理が実際に次のようになることがわかります。
[単位] 説明=アークサーバー ドキュメント=https://unix.stackexchange.com/questions/212059/ 以降 = network.target [提供する] ユーザー=スチーム 環境=セッション=Linuxセッション名 環境=QUERYPORT=27016 環境=PASS=パスワード 環境=ADMINPASS=管理者パスワード ExecStart=/home/steam/ARK/ShooterGame/Binaries/Linux/ShooterGameServer TheIsland?SessionName=${SESSION}?QueryPort=${QUERYPORT}?ServerPassword=${PASS}?ServerAdminPassword=${ADMINPASS}?listen 制限NOFILE=100000 再起動=常に [インストールする] WantedBy =マルチユーザー。ターゲット
systemdに移行する最初のルールは何ですか?いいですね。今は2015年なのに、すでに誰かがやってきた可能性が高いです。実際、私より4日先にここに誰かがすでに来ています。彼らはテロを起こさなかった。
追加読書
- レナート・ペトリング(2013-10-07)。
systemctl
。システムのマニュアルページ。 freedesktop.org. - ジョナサンデボインポラード(2015)。 システム化された恐怖の家。一般的な回答(固定URL)
- https://unix.stackexchange.com/a/207363/5132
- https://askubuntu.com/a/626858/43344
- 「自動起動」。専用サーバーの設定。サバイバルイボルブドウィキ。