2016-12-22 2 views
1

私はthis interesting questionを読んでいます。基本的には、子プロセスではないプロセスのPIDに常に到達しないように言われています。それはよく説明され、完璧な意味を持っています。まれな例外にチェックPIDを使用しても構いませんか?

しかし、OPはcronのはされるものではなく、私は非常に異なる状況にいるよ何かをしようとしたとき:

  1. 私は、プロセスを実行するごとに5分を言うが、一度で100回実行するには5分以上かかります(2つのインスタンスを同時に実行することはできません)。
  2. 他のプロセスを強制終了または操作したくない場合、プロセスの別のインスタンスが実行中であれば、何もせずにプロセスを終了したいだけです。

この場合、「非子プロセス」のPIDをフェッチすることはできますか?もしそうなら、どうすればいいのですか?

私はif pgrep "myscript"; then ...などの処理を試みましたが、プロセスは独自のPIDを検出しました。私はより多くのものが見つかるかどうか調べる必要があります。


(最初にリダイレクトされる前に、私はthis questionを読んで、しかし、与えられたソリューションが動作しません:それはそれを使用してプロセスのpidを与えることができます)

EDIT:私は前にそれを言及している必要があり、スクリプトがすでに使用されている場合は、少なくともログファイルに何かを書く必要があります。少なくともdate>>script.log; echo "Script already in use">>script.log"、私は間違っているかもしれませんが、私は群れがそれを行うことを許可していないと思います。

+2

基本的に、プロセスのインスタンスは常に1つだけであることを確認します。相互排除を実装するためにロックファイルを使用することをお勧めします。ロック関連の議論については、この質問を参照してください:http://stackoverflow.com/questions/41275785/bash-how-to-implement-locking-in-a-multi-process-system/41275952#41275952 – codeforester

+0

@codeforesterスクリプト私はログファイルにいくつかのものを書きます。スクリプトがロックされている場合、私は日付+ "スクリプトはすでに使用中"を書くことができないのですか? –

答えて

1

lckdoまたはflockを使用すると、重複した実行を避けることができます。

DESCRIPTION 
     lckdo runs a program with a lock held, in order to prevent multiple 
     processes from running in parallel. Use just like nice or nohup. 

     Now that util-linux contains a similar command named flock, lckdo is 
     deprecated, and will be removed from some future version of moreutils. 

もちろん、このプリミティブなロックファイル機能を自分で実装することができます。

if [ ! -f /tmp/my.lock ];then 
    touch /tmp/my.lock 
    run prog 
    rm -f /tmp/my.lock 
fi 
+1

"実装"に競合状態があります。 –

+0

それは方法を示す唯一の例です。彼は '群れ'や 'lckdo'を使うべきです。 –

+1

質問を編集してください。そのコードは時間の大半*で動作するので危険です。 –

関連する問題