Unix - psはスクリプトが実行されていることを確認します。

Unix - psはスクリプトが実行されていることを確認します。

私はいくつかのデータを回復するためにいくつかのユーティリティを処理するように設計されたスクリプトを実行しています。スクリプトは、ユーザーが復元する必要があるファイルを保存できるディレクトリにあります。このディレクトリには多くのユーザーがアクセスしてスクリプトを実行できるため、すでにスクリプトが実行されているかどうかを確認する条件が必要です。その場合は、「後でもう一度やり直してください」というメッセージを出力してください。それ以外の場合は、通常どおり実行してください。

私はここでいくつかの調査を行い、これが上記の私の機能の動作コードだと思いました。

#!/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は思ったよりも異なる方法でキー文字を使用します。optionspsh

私は以下を使用することをお勧めします:

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を実装するかどうかによって異なります。一部のシェルはこれを自動的に実行しない可能性があるため、自分のシェルが正しく機能しているかどうかを知る必要があります。

関連情報