systemdなしで起動すると、systemdサービスはCPUを100%使用します。

systemdなしで起動すると、systemdサービスはCPUを100%使用します。

私は最新のアップデートを含むDebian Jessieを使用しています。サーバーの起動時にスクリプトを実行するためのsystemdサービスを作成しました。構成は次のとおりです。

[Unit]
Description=(my description)

[Service]
ExecStart=/usr/bin/bot
Restart=restart-always

[Install]
WantedBy=multi-user.target

/usr/bin/botMono 実行可能ファイルを実行するスクリプトです。これには以下が含まれます。

#!/bin/bash
(cd /path/to/my/executable && mono bot.exe)

(ここでパスを変更しましたが、スクリプトのパスは正しいです。)

/usr/bin/botスクリプトを正常に(私の端末でのみ)実行すると、/usr/bin/bot期待どおりに機能します。topCPUの0〜20%を使用すると報告し、これは正常な現象です。ところで で始めると、service bot start常にtopCPUを100%以上使うと出てきます。

どちらの場合もbot期待どおりに機能します。

CPU使用率のこの大きな違いをどのように説明できますか?

ありがとうございます。

答え1

問題はsystemdにありません。

Systemdは標準入力(=/dev/null)なしでプロセスを実行します。すべてのシステムコールはread()すぐに完了します(通常の標準入力を使用し、read()新しいデータが到着するまでブロックされます)。通常、read()完了していないループを呼び出すと、膨大なCPU使用率が発生します。これを確認するには、実行中のプロセスへの接続を試してくださいstrace -p <pid>

プロセスは、標準入力なしで実行するように調整するか、提案されたコマンドなどのいくつかのscreenラッパーを使用する必要があります。nohup

答え2

botscreen私は次のように私を下に置いて「固定」しました。

[Unit]
Description=(my description)

[Service]
RemainAfterExit=yes
ExecStart=/usr/bin/screen -dmS bot /usr/bin/bot
Restart=restart-always

[Install]
WantedBy=multi-user.target

私のプロセスを画面に表示すると、高いCPU使用率が解決された理由はわかりませんが、うまくいきました。

答え3

@niziakのソリューションによると、入力がブロックされます。私の場合は、StandardInput=tty[サービス]を追加して解決しました。出力を/ dev / tty12の(使用されていない)コンソールにリダイレクトしました。

私の[サービス]セクション:

[Service]
ExecStart=/usr/local/bin/vtclock -1  -c| -f /tmp/ntpstatus
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartPreventExitStatus=255
Type=simple
User=vtclock
StandardInput=tty
StandardOutput=tty
StandardError=null
TTYPath=/dev/tty12 

(OS = Ubuntu 16.04.3 LTS、systemdサービスを初めて試しました)

答え4

C#/ .NET Coreでコンソールアプリケーションを開発した場合は、次のようにコンソールを実行しないでください。

Console.Read();

Linuxでシステムサービスとしてアプリケーションを実行すると、CPU使用率が100%になるためです。

代わりに、以下を使用してください。

while (true) { Console.ReadKey(); }

私も同じ問題があります。

関連情報