Cronジョブの結果が独自のシェルで実行するのとは異なる

Cronジョブの結果が独自のシェルで実行するのとは異なる

私はUbuntu 12.0.4を使用しており、基本的に次のコードを含むスクリプトがあります。

lockfile=/var/tmp/mylock

if ( set -o noclobber; echo "$$" > "$lockfile") 2> /dev/null; then
    exit_normally "instance is running"
else
    echo "no instance is running"
fi

/var/tmp/mylock ファイルが私のシステムに存在しないため、スクリプトを手動で実行すると、「実行中のインスタンスがありません」というメッセージが表示されます。これは正しいです。

ただし、cronによってシェルスクリプトが実行されると、常に「インスタンスが実行中です」を返します。

上記の問題の根本原因を見つけるためにどこをチェックする必要があるのか​​、何を見つけるのかわかりません。ここからいくつかのガイダンスが得られることを願っています。

ベストアンサー1

通常、ファイルを生成し、ファイルが存在する場合、オペレーティングシステムがファイルを破損しないことを期待するのは、ファイルが存在するかどうかをテストする良い方法ではありません。

あなたはより良いサービスを得るでしょう:

if [ -f $lockfile ]; then
  exit_normally "instance is running"
else
  echo "no instance is running"
fi

ただし、ファイルの存在をロックファイルとして使用する場合は、unix lockfileコマンドを使用することをお勧めします。

lockfile -r 0 $lockfile
if [ $? -ne 0 ]; then
  exit_normally "instance is running"
else
  echo "no instance is running"
fi

おすすめ記事