Singletonパターンを達成するために、Linuxのシェルスクリプト

I.説明

シングルトンモードについては、いくつかのガジェット稼働し、その後の始まりは、実行をクリックするように指示されますつのインスタンスを実行してきた、私は非常に興味深いものを感じるが、本当に気にしませんでした。

コードの一部の元指導者が理解していないのこぎり前にいくつかの時間は、同僚が、特定の性能デザインパターンを金型の単一のケースをされて知らなかった議論の下で、シングルトンを達成することである情報をチェックして何をするかですそれはあなたが唯一のインスタンスを実行することができ、上記と述べました。

システムのspeakと書き込みシェルスクリプトへのフィードバック先週は、調査中のプロセスの良い番号を実行すると、yumのコマンドは、スクリプトがスタックプロセスを引くたびに実行されます、ロックを待つことができないスクリプト全体が原因詰まった原因であることが判明しているあります。このように感じてシェルスクリプトも、シングルトンパターンを検討すべきです。

 

現在のプロセスシングルトンの終了前に、既存のプロセスであれば第二に、

#!/ binに/ bashの
メイン(){ 
    #$ 0が、ファイルの現在の名前である
    あなたは、bashのtest.shを実行している場合#その後、$ 0がテストです。SHの
    #あなたは、bashの実行している場合は /tmp/test.shをその後、$ 0を/ tmp /テストです。SHの
    あなただけでもベース名$ 0 file_nameにすることができますどのようにファイル名に関係なく、実行したい場合は# = $ { 0 ## * / } 
    file_nameに = $ 0 
    、ファイルの現在のインスタンスだけでなく、現在のファイル名の数が1より大きい場合#マッチング処理を、プロセスが現在のプロセス終了します
    認知それは原因が2以上である1より大きく、あるべき#を、背後にあると述べた
    IFは、 | [ `のpgrep -f $ {file_nameに} WC -l` -gt 2 ]
     その後、
        エコー " $ {プロセスは} file_nameに、[終了となります。存在していた
        の終了を。1 
    FiのSLEEP 60 
} 
メイン

 

第三に、プロセスの終了前に、プロセスは、現在のプロセスシングルトンまで継続された場合

#!/ binに/ bashの
メイン(){ 
    #$ 0は現在のファイル名である
    FILE_NAME = $ 0 
    他のすべてのプロセスの現在のプロセスに加えて、#ファイル
    pid_list = $(のpgrep -f $ {file_nameに} | grepの -v ^ $$ \ $)
    を除き、一つ#キルプロセスの1 
    のための tmp_pid $ {} pid_list
     DO 
      そのすべての子プロセスに加えて、#キル
      pkillは - P $ {tmp_pid} 子供が状態のままとして、デフォルト15)SIGTERM状態を受信してから出口までまっすぐ行くことができません;殺すためにカーネルから直接9)SIGKILL送ら
      #pkillは - 9 - P $ tmp_pid} { 
      独自のに加え解体#
      #のpkillは - 唯一の子プロセスを殺すPは除く除いて、独自に殺さない
      #を潜在的にブロックします子プロセスを殺すことに加えて、プロセス自体は、次の工程で、その結果、迅速手順キルキルを除く時間がありません
      殺す - 9 $ {} tmp_pid
     行わ
} 
メイン

 

第四に、説明の上の2つのモードに注意してください

4.1文が1より大きく2より大きくない場合は、なぜの二番目に大きい部分であります

このスクリプトは、1よりも大きい場合、我々は、プロセスを開始するには、このスクリプトを実行することを一般的な認識から、対応するプロセスの数は、それが他のプロセスがあることを示しています。しかし、我々は、要件が2以上である、上のコードです。

ビューの観測点から、プロセスを開始するためのスクリプトを実行しているためです。そして、特定の時間、各コマンドは、子プロセスの後に終了するスクリプトの実行を実行するために子プロセスを作成します。それでも、このようなのpgrep名などの一般的なコマンドの親プロセスの子プロセスの名前と同じ。プロセスのアウト統計は数2となりますので、コードの二番目に大きい部分は2以下を達成します。

、プロセス名のpgrepおよびその他の「一般的なコマンド」というここでのストレスに加えて、睡眠など、独自のコマンドがあります。どのような一時的に特殊なカウントされていない通常のオペレータは、非常に明確でした。

 

4.2これは、コードの第3の部分に影響を及ぼしません

各コマンドを実行する子プロセスを構築する実行し、子供の名前と親プロセス名が一致し、コードの第三の最大部及び閉鎖され、現在の親プロセス以外のすべてのプロセスと等価であるからです。また、親プロセスの現在の状況は問題を抱えているにつながった親プロセスを殺すために子供を提示するために表示されないのでしょうか?答えはありません。

pgrepコマンドは、grepのに渡され、親プロセスpid、PIDのpgrep子プロセスpidと以前に存在することができるスクリプトを実行する他、grepのは、子プロセスを殺すために渡された後、PID PIDのpgrepおよび他の以前に存在することができるスクリプトを実行します。

また、子プロセスが終了した後のコマンドでコマンドを実行する前に、子プロセスを開始し、フロントに言ったので、終了し、自分自身をgrepするに渡されたときに、子プロセスのpgrepを殺すためにkillコマンドを待つことができません。

 

参考:

https://www.mylinuxplace.com/bash-singleton-process/

https://stackoverflow.com/questions/15740481/prevent-process-from-killing-itself-using-pkill

おすすめ

転載: www.cnblogs.com/lsdb/p/12010128.html