同様の質問への回答がここで何度も出てきたことがわかり、私の質問は奇妙に思えるかもしれませんが、私の状況は異なります。 Linuxシャットダウンコマンドをキャプチャしたいです。今後別のプロセスはUIにメッセージを表示し、終了を延期/キャンセルします。
状況はこんな感じです。
私たちは仕事に仮想マシン(Amazon Workspaces)を使います。私たちはこのマシンへのルートアクセスを持っていますanother people
(例えば、セキュリティ担当者)。彼らはanother people
私たちを尊重せず、私たちがコンピュータで作業しているときにLinuxワークスペースを再起動します。私たちはUI(例えばIntellij IDE)を持つアプリケーションを使用し、時には端末で作業します。残念ながら、ここには再起動が差し迫ったことを警告する通知はありません。another people
遅延の有無にかかわらず、仮想ワークスペースを再起動する方法がわかりません。
私が欲しいもの:
- 終了信号をキャプチャするスクリプトをバックグラウンドで実行します。
- 終了信号の取得今後どのアプリケーションでも動作します!
- UI警告を表示します(ターミナルメッセージではありません)。
- これによりシャットダウンが防止され、後でマシンを手動で再起動できます。
私はbashスクリプトからシグナルをキャプチャしてtrap
キャンセルできることを知っていますが、shutdown -c
時には遅すぎるため、スクリプトがタスクを実行する前にシグナルが実行されている他のユーザープロセスを終了します。
問題は、他のプロセスがシャットダウン信号をキャプチャし、シャットダウンをキャンセルする前に何らかの方法でシャットダウン信号をキャプチャしてキャンセルできることです。
たぶん、この状況を処理するための既存のツールがあるかもしれませんが、わかりません。
another people
信じられないか、私たちは何度も会話を試みました。もう1つの問題は、営業時間外にシャットダウンが発生した場合、リモートデスクトップのみを閉じて翌朝に戻ってくるため、ジョブを保存しないため、シャットダウンも延期する必要があることです。
別のタイムゾーンで作業している場合は、勤務時間を定義する方法は別の問題です。
主な問題は、終了信号をキャプチャする方法です。今後すべてのアプリケーションに到達してキャンセルします。
答え1
[C]他のプロセスがシャットダウン信号をキャプチャする前に、何らかの方法でシャットダウン信号をキャプチャしてキャンセルし、いつでもシャットダウンをキャンセルできますか?
それは不可能です。システムをシャットダウンしたい場合は、カーネルにシステムをすぐにシャットダウンし、すべてのユーザースペースメカニズム(reboot
システムコールを使用するなど)をバイパスするように指示することができます。これを防ぐ方法はありません。
あなたのような仮想環境では、状況はさらに恐ろしいです。何の通知も受け取らずに、単にコンテナを解体したり、VMをシャットダウンしたりできるからです。
Bashスクリプトでトラップを使用して信号をキャッチできることを知っています。
これらの信号を捉えるとどうなりますか?あなたは間違っています。正常に終了すると、initシステムはSIGTERM
最終的にSIGKILL
実行中のプロセスに送信します。これは、システムがただちにシャットダウンし、アプリケーションがジョブを保存する必要があることをシステムに示します。重要なのは、これは交渉ではなく、作業を節約するためのガイドラインです。をトラップしても、シャットダウンはSIGTERM
中断または遅延されません。
妨害要素を減らすためのいくつかのアイデア:
- IDEに定期的に作業内容を自動的に保存します。これにより、予期しないシャットダウンの問題は解決されませんが、データの損失は最小限に抑えられます。
rsync
ローカルマシンで作業し、VCS経由またはVCSを使用してタスクを仮想マシンと同期することを検討してください。これにより、仮想マシンがシャットダウンしてもジョブにアクセスできます。
これらの技術ソリューションのいくつかは問題を部分的に軽減するかもしれませんが、機械にアクセスしている複数の当事者間のコミュニケーションや尊重が欠けているという重要な問題を解決しません。ある方法でコンピュータをシャットダウンできない場合は、間違いなく別の方法でシステムをシャットダウンします。ソーシャルソリューションにもっと集中することをお勧めします。
答え2
コメントからわかるように、正しい解決策は、問題を引き起こす個人と話すことです。これが失敗した場合は、経営陣を介して問題をエスカレーションしてください。
しかし、ただ楽しさのために問題を解決する方法を考えてみましたが、必要以上に複雑なソリューションを設計していると思います。特に、ルート .bashrc に以下を追加できます。
alias reboot="killall -9 -u securityguy1 -u securityguy2 -u securityguy3"
通常、リモート再起動時に受信する唯一のメッセージはコンピュータから追い出されたことであり、上記のコマンドはリストされているすべてのユーザーを追い出します。
もう一度申し上げますが、これをしないでください。私はあなたの解雇に対して一切の責任を負いません。