5

内部にプロセスpidを含むロックファイルを作成するrsnapshotでバックアップを行います。今、rsnapshots バックアップからバックアップを作成したいので、2 番目の外部バックアップ用にこのロックファイルを作成する方法を探しています。

シェル スクリプトは次のようになります。

  1. ロックファイルが存在するかどうかを確認し、存在する場合は待ってから再試行します (これは while true ループで実行しています)
  2. このシェル スクリプトの pid を取得し、rsnapshot ロック ファイルとして保存します。
  3. 2 番目の外部バックアップを開始する
  4. ロックファイルを削除する

PID を取得して rsnapshot lockfile として保存するにはどうすればよいですか?

4

2 に答える 2

8

PID は次の場所に格納されます。$$

お気に入り

echo $$ > thisscriptpidfile
于 2013-10-20T13:04:29.157 に答える
2

どのアプリケーションでも、ps を使用して、Unix シェル自体を使用してプロセス ID を見つけることができます。以下の例は、ps からの非常に縮小されたリストです。PS は、PID だけでなく、所有者と親プロセス ID (この特定のプロセスを開始したプロセス) も表示します。

userX#  ps -ef | more
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 Oct19 ?        00:00:00 /sbin/init
root         2     0  0 Oct19 ?        00:00:00 [kthreadd]
root         3     2  0 Oct19 ?        00:00:02 [migration/0]
root         4     2  0 Oct19 ?        00:04:48 [ksoftirqd/0]
root         5     2  0 Oct19 ?        00:00:00 [migration/0]
root         6     2  0 Oct19 ?        00:00:00 [watchdog/0]
...
root        27     2  0 Oct19 ?        00:00:00 [pm]
root        28     2  0 Oct19 ?        00:00:00 rsnapshot
root        29     2  0 Oct19 ?        00:00:00 [xenbus]

それでは、どのプロセスが私たちにとって興味深いかを見つけ始めましょう。私は rsnapshot に詳しくないので、例にダミー データを入れました。

userX#   ps -ef | grep rsnapshot
root        28     2  0 Oct19 ?        00:00:00 rsnapshot
ec2-user  7233  1497  0 11:32 pts/0    00:00:00 grep rsnapshot

grepのおかげで、「ヘッダー」情報は提供されず、一致する行のみが提供されることに注意してください。2 番目の「列」は PID です。注目すべき点: ps は、実行したばかりの grep を含むすべてのプロセスを表示します。コマンド/スクリプトはこれに注意し、これらの項目を削除する必要があります。次の例では awk を使用してそれを行います。

さらに拡張して、PID をファイルに取得します。PID があることを確認する必要があります。ある場合は、ロック ファイルを作成するコマンドを作成します。

userX#   ps -ef | grep rsnapshot |  awk '$0!~/grep/ && $2~/[0-9]/{print "echo "$2" > rsnapshot.lck"}'
echo 28 > rsnapshot.lck

rsnapshot の PID が存在しない場合、出力はありません。書かれているように、awk は各行を確認し、文字列「grep」が含まれておらず、2 番目のフィールドに数字 [0-9] がある場合は、実行するコマンドを出力しますが、実際にはコマンドを実行しません。

最後のステップは、awk 出力からコマンドを呼び出すことです。

userX#   ps -ef | grep rsnapshot |  awk '$0!~/grep/ && $2~/[0-9]/{print "echo "$2" > rsnapshot.lck"}' | sh

「| sh」を追加すると、すべての出力がコマンドとして呼び出されます。awk が rsnapshot を見つけられない場合、実行するコマンドはありません。

于 2013-10-20T15:59:07.117 に答える