OSのシャットダウンを特定してOSをシャットダウンする前に、いくつかの作業を行う必要があります。私はFedora 19とC ++を使用しています。
次のC ++コードを使用して、コンソールから終了信号をキャプチャできます。
myAct.sa_handler = myStructure::mySignalHandler;
sigaction(mySignal, &act, NULL);
この信号は、閉じる前にカスタムコードを実行することで有効にできますmySignal
。/etc/init.d
Fedora 12 Kernel 2.6では、このソリューションは完全に機能します。このソリューションは、グラフィカルインターフェイスを使用してコンピュータをシャットダウンしようとすると、Fedora 19 Kernel 3.9.5で動作します。
ただし、ターミナルのコマンドを使用してFedora 19カーネル3.9.5でコンピュータを再起動またはシャットダウンすると、コードを実行できません。このソリューションは一般的に使用されているスクリプトシステムを削除するため、これ以上機能しませんinit.d
。
その場所にスクリプトを配置すると、機能せずにスクリプトが/usr/lib/systemsd
実行されますが、他のスクリプトも実行されます。だから私のコマンドを処理せずにシステムがシャットダウンします。
この問題をどのように解決できますか?
答え1
この信号は以下から得ることができる。作業プロセス。したがって、起動時に長寿命のプロセス(デーモンとも呼ばれる)を開始すると、実際にそのプロセスからSIGTERMを受け取り、シグナルハンドラで必要なすべてのタスクを実行します。しかし、これは最悪のアプローチです。追加のプロセスは、信号が到着するのを待つ以外は何もしません。
特にこれを達成するためのより良い方法があります。体系的に。単位ファイル(foo.service
)は次のとおりです。
[Unit]
Description=Perform my actions
DefaultDependencies=no
Before=shutdown.target
[Service]
Type=oneshot
ExecStart=/path/to/your/application
ただし、systemdの並列性により、終了プロセスの後半にデバイスがランダムに起動できることに注意してください(依存関係を慎重に使用すると影響を受ける可能性があります)。