悪魔

悪魔

Debian 9 で実行される .NET Core サービスがあります。これをMyServiceといいます。ある時点update.shで、サービスProcess.Start()ShellExecute=true

このスクリプトはデフォルトで機能しますapt-get update; apt-get upgrade

パッケージのアップグレード中に MyService プロセスが終了します。更新スクリプトも終了してapt-get upgrade終了するため、手動で変更する必要がある一貫性のないパッケージが残ります。

私が望むのは、update.shMyServiceが終了したときに終了しないことです。

私はそれをupdate.sh2つの部分に分けようとしました。最初の部分は2番目の部分を別々に実行しようとしましたが、update2.sh常に同じ結果を得ましたsetsid。同じ結果で、新しいbashシェルでスクリプトを実行してnohupみました。update2.sh/bin/bash /c "update2.sh"

スクリプトの実行中にバイナリを終了できるように、バイナリで起動されたスクリプトをバイナリプロセスから完全に分離して実行するにはどうすればよいですか。

これが私の環境です。 MyServiceはサービスとして実行されるバイナリです。update.shMyServiceによって開始されました。

MyServiceバイナリでシェルスクリプトを実行する.NET Coreコード:

var process = new Process();
process.EnableRaisingEvents = true; // to avoid [defunct] sh processes
process.StartInfo.FileName = "/opt/myservice/update.sh";
process.StartInfo.Arguments = "";
process.StartInfo.UseShellExecute = true;
process.StartInfo.CreateNoWindow = true;
process.Start();
process.WaitForExit(10000);
if (process.HasExited)
{
  Console.WriteLine("Exit code: " + process.ExitCode);
}
else
{
  Console.WriteLine("Child process still running after 10 seconds");
}

アップデート.sh:

nohup /opt/myservice/update2.sh > /opt/myservice/update.log &
systemctl stop MyService

2.shアップデート:

apt-get update >> /opt/myservice/update.log
apt-get -y install --only-upgrade myservice-1.0 >> /opt/myservice/update.log

update2.shMyServiceが終了すると終了するため、実行されませんupdate.sh

update.sh戻りコード 143、終了したようです。

2018-08-16 14:46:14.5215|Running update script: /opt/myservice/update.sh
2018-08-16 14:46:14.5883|Update script /opt/myservice/update.sh returned: 143

修正する

ご提案ありがとうございます。

  • 設定値
  • 否定する
  • 北面
  • 画面
  • マルチプレクサ
  • 共有をキャンセル

各メソッドは、生成されたすべてのプロセスを終了するのと同じ結果を持ちます。私はこれが.NETコア「機能」だと思います。

アップデート2

私はsystemctl stop MyService基本的にサービスによって生成されたすべてのプロセスが明示的に終了することを発見しました。

https://stackoverflow.com/questions/40898077/systemd-systemctl-stop-aggressively-kills-subprocesses

KillMode=processサービス記述子に追加すると、サービスの終了時に更新スクリプトは終了しません。

持つ絶対開始されたサービスのPIDスペースをエスケープしてくださいsystemctl。許可された回答を含む使用された各テクノロジは、個別のプロセスを作成しません。指定systemctl stop MyServiceしない限り、KillMode=process生成された各プロセスは常に終了します。

結局別のサービスを作成しましたMyServiceUpdater。このサービスは、分岐することなく簡単な更新スクリプトを実行します。 PID空間が異なるため、すべてが期待どおりに機能します。長い旅でした。

MyServiceUpdaterの例:

[Unit]
Description=Your Service Updater
After=network.target

[Service]
ExecStart=/path/to/update/script/updatescript.sh
ExecStopPost=
TimeoutStopSec=30
StandardOutput=null
WorkingDirectory=/path/to/service/directory/
KillMode=process

[Install]
WantedBy=multi-user.target

ベストアンサー1

ジョブをスケジュールするには、crontab(またはat)(mono / .netではない)を使用してください。

一般的なオプション

  • いいえmy.sh&
  • 画面 -dm -S 私の my.sh
  • tmux new -d -s my.sh
  • サービス内起動/systemctl開始
  • Ctrl+Z、bg、拒否

おすすめ記事