私は最新のアップデートを含むDebian Jessieを使用しています。サーバーの起動時にスクリプトを実行するためのsystemdサービスを作成しました。構成は次のとおりです。
[Unit]
Description=(my description)
[Service]
ExecStart=/usr/bin/bot
Restart=restart-always
[Install]
WantedBy=multi-user.target
/usr/bin/bot
Mono 実行可能ファイルを実行するスクリプトです。これには以下が含まれます。
#!/bin/bash
(cd /path/to/my/executable && mono bot.exe)
(ここでパスを変更しましたが、スクリプトのパスは正しいです。)
/usr/bin/bot
スクリプトを正常に(私の端末でのみ)実行すると、/usr/bin/bot
期待どおりに機能します。top
CPUの0〜20%を使用すると報告し、これは正常な現象です。ところで で始めると、service bot start
常にtop
CPUを100%以上使うと出てきます。
どちらの場合もbot
期待どおりに機能します。
CPU使用率のこの大きな違いをどのように説明できますか?
ありがとうございます。
答え1
問題はsystemdにありません。
Systemdは標準入力(=/dev/null)なしでプロセスを実行します。すべてのシステムコールはread()
すぐに完了します(通常の標準入力を使用し、read()
新しいデータが到着するまでブロックされます)。通常、read()
完了していないループを呼び出すと、膨大なCPU使用率が発生します。これを確認するには、実行中のプロセスへの接続を試してくださいstrace -p <pid>
。
プロセスは、標準入力なしで実行するように調整するか、提案されたコマンドなどのいくつかのscreen
ラッパーを使用する必要があります。nohup
答え2
bot
screen
私は次のように私を下に置いて「固定」しました。
[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(); }
私も同じ問題があります。