アプリケーションが終了する時点を監視する方法は?

アプリケーションが終了する時点を監視する方法は?

Atomテキストエディタが閉じたときにスクリプトが実行されるように監視したいと思います。

コマンドライン構文を使用してエディタを開きたいですatom。エディタを閉じるときにbashスクリプトを実行したいと思います。

どうすればいいですか?

ベストアンサー1

コマンドライン構文を使用してエディタを開きたいですatom。エディタを閉じるときにbashスクリプトを実行したいと思います。

atom実際に実行されwhatever実行されるシェル関数またはスクリプトを作成します。


例関数

atom () (
  command atom "$@"
  /path/to/whatever
)

右側のスタートアップファイル(~/.bashrcBashの場合)に関数を定義します。新しいシェルを開きます。これからatomシェルから呼び出すと、関数が実行されます。この方法はシェルの外側には影響しません。


サンプルスクリプト

(注:スクリプトで関数を使用することは意味がありません。)

#!/bin/sh
/path/to/real/atom "$@"
/path/to/whatever

スクリプトに名前を付けて実行可能にし、他のディレクトリより古いatomディレクトリに配置します(これらのディレクトリを作成して変更する必要があるかもしれません)。今、変数を使用してそれを見つけるすべてがスクリプトを見つけるでしょう。この方法はシェルの外部で動作します。PATHatomPATHPATHatom

ただし、Atomを通常のパス(つまりパスではなくパス)で実行しようとすると、実際のスクリプトのように実行されPATHます。atom実際の値を別の場所に移動し、誰もがatom実際の値を期待する場所にスクリプトを配置できますがatom/path/to/real/atomスクリプトが独自に呼び出されないようにスクリプトで調整)、Atomを更新することは非常に難しいため、お勧めできません。スクリプトを上書きできます。


可能な改善

  • 上記の関数または上記のwhateverスクリプトは最後のコマンドであるため、終了状態で終了します。たぶん実際のシャットダウン状態で終了したいと思うかもしれませんatom。これは特にスクリプトに当てはまります。この名前のスクリプトは、atom実際のプログラムを実行したいすべてのプログラムによって呼び出され、呼び出しプロセスの一部が終了ステータスを使用して特定のタスクを実行することを除外することはできatomません。atom

    終了状態を維持する関数は次のとおりです。

    atom () (
       command atom "$@"
       status="$?"
       /path/to/whatever
       exit "$status"
    )
    

    (この関数は意図的にサブシェルで実行されるため、そのstatus変数はメインシェルには影響しません。)

    同じスクリプト:

    #!/bin/sh
    /path/to/real/atom "$@"
    status="$?"
    /path/to/whatever
    exit "$status"
    
  • 関数またはスクリプトが実際に終了した後、できるだけ早く終了したい場合も、非同期的atomに起動したい場合もありますwhatever。代わりに/path/to/whatever &関数/スクリプトを実行してみてください/path/to/whatever


一般的な注意事項

  • 関数またはスクリプトはwhatever次の後に実行されます。努力するRunning real atomatomRealがウィンドウを表示または開始するかどうかは問題ではありません。終了ステータスをテストすると、いくつかの例外(/path/to/real/atomトリガされた場合はNo such file or directory終了ステータス127)が検出され、条件付きでこれを抑制できますwhatever。 「アプリケーションが閉じたとき」が「ウィンドウが閉じたとき」を意味する場合、状況はそれほど単純ではありません。

  • 通常、ブラウザやテキストエディタなどのプログラムを2番目に呼び出すと、別のインスタンスがすでに実行されていることを検出し、独自のタスクを別のプロセスに委任できます。実際には、新しいタブや古いウィンドウに何かが生成されるのと同じです。ジョブが引き継がれた直後に、新しいプロセスが終了します。ジョブは以前のインスタンスの責任です。 Atomがこのタスクを実行すると、whateverタスク自体が完了/終了していなくても、新しいプロセスがタスクを委任して終了した直後にタスク(新しいプロセスに関連付けられている)が実行されることがわかります。私はAtomを知らず、このように動作できるかどうかわかりません。

  • 通常、プロセスは独自の実行可能ファイルまたは名前を呼び出して別のインスタンスを作成できます(おそらくウィンドウなしで自動的に)。 Atom(つまり、実際)が場所atomで使用されている方法でこれを実行してスクリプトを見つけた場合、予想よりも多くのインスタンスを観察できます。一部の方法は使用されません。繰り返しますが、私はAtomを知りません。これを行うのか、どのように行うのかわかりません。PATHatomwhateverPATH

おすすめ記事