私はいくつかのデータを回復するためにいくつかのユーティリティを処理するように設計されたスクリプトを実行しています。スクリプトは、ユーザーが復元する必要があるファイルを保存できるディレクトリにあります。このディレクトリには多くのユーザーがアクセスしてスクリプトを実行できるため、すでにスクリプトが実行されているかどうかを確認する条件が必要です。その場合は、「後でもう一度やり直してください」というメッセージを出力してください。それ以外の場合は、通常どおり実行してください。
私はここでいくつかの調査を行い、これが上記の私の機能の動作コードだと思いました。
#!/bin/bash
me="$(basename "$0")";
running=$(ps h -C "$me" | grep -wv $$ | wc -l);
[[ $running > 1 ]] && exit;
私はこの機能と上記のコードをSolaris SunOS 5.8で実装したいと思います。私はpsがUnixとLinuxで異なる動作をしていることを知っています。
答え1
使用中の ps コマンドは UNIX とは関係ありません。
「代わりに」はBSDで使用されましたが、key letters
標準には含まれていません。 BSDは思ったよりも異なる方法でキー文字を使用します。options
ps
h
私は以下を使用することをお勧めします:
ps -p $$
このスクリプトのインスタンスがさらにあるかどうかを確認するには、次のようにします。
myname=`basename $0`
pids=`pgrep -d, $myname`
ps -p $pids
理論的には再実行する必要はなく、ps
出力にカンマがあることを確認するだけで十分です。pgrep
ファイルロックアルゴリズムを実装し、POSIX準拠のシェルを使用したい場合は、次のものを使用できます。
set -o noclobber
:> /var/tmp/myscript
if [ $? -ne 0 ]; then
echo already running
exit 1
fi
... do some stuff
rm /var/tmp/myscript
これが安定して動作するかどうかは、シェルがPOSIXが好む方法でnoclobberを実装するかどうかによって異なります。一部のシェルはこれを自動的に実行しない可能性があるため、自分のシェルが正しく機能しているかどうかを知る必要があります。