Debian 9 で実行される .NET Core サービスがあります。これをMyServiceといいます。ある時点update.sh
で、サービスProcess.Start()
はShellExecute=true
。
このスクリプトはデフォルトで機能しますapt-get update; apt-get upgrade
。
パッケージのアップグレード中に MyService プロセスが終了します。更新スクリプトも終了してapt-get upgrade
終了するため、手動で変更する必要がある一貫性のないパッケージが残ります。
私が望むのは、update.sh
MyServiceが終了したときに終了しないことです。
私はそれをupdate.sh
2つの部分に分けようとしました。最初の部分は2番目の部分を別々に実行しようとしましたが、update2.sh
常に同じ結果を得ましたsetsid
。同じ結果で、新しいbashシェルでスクリプトを実行してnohup
みました。update2.sh
/bin/bash /c "update2.sh"
スクリプトの実行中にバイナリを終了できるように、バイナリで起動されたスクリプトをバイナリプロセスから完全に分離して実行するにはどうすればよいですか。
これが私の環境です。 MyServiceはサービスとして実行されるバイナリです。update.sh
MyServiceによって開始されました。
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.sh
MyServiceが終了すると終了するため、実行されません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、拒否