2

クラスター ( SGE ) でsqlite3を使用するスクリプトを実行しようとしています。

スクリプトはlockfileでロックを作成し、データベースをいっぱいにしてロックを解放します。

  $cat test.sh

  #!/bin/sh
  lockfile /commun/data/_tmp.idp448.lock
  sqlite3 /commun/data/stats.sqlite "create table if not exists timeBeginDB(target text UNIQUE NOT NULL,inserted int);"
  rm -f /commun/data/_tmp.idp448.lock
  whoami

/commun/data/ はすべてのノードから見えます。/commun/data/_tmp.idp448.lock は私が作成したランダムな名前です。現在、新しいクラスターを使用しているのは私だけです。

qsub がなければ、スクリプトは問題なく動作します:

  [lindenb]$ sh test.sh
  lindenb #prints whoami, no error on stderr

qsubが呼び出されたとき:

  $ qsub -cwd -S /bin/sh test.sh
  Your job 673 ("test.sh") has been submitted

  $ cat test.sh.o673
  lindenb #prints 'whoami', so the lock have been created and deleted


  $ cat test.sh.e673
  Error: database is locked

これは sqlite3 エラーです。

SGE側で、その問題、この動作の違いの原因が何であるかについてのアイデア、提案はありますか?

ありがとうピエール

アップデート:

クラスターのノードに root としてログインしました。次の単純なコマンドは失敗します: (/commun/data/stats2.sqlite は存在しません)

ssh root@node02
root@node02's password:
sqlite3 /commun/data/stats2.sqlite 'create table if not exists timeBeginDB(target text UNIQUE NOT NULL,inserted int);'
Error: database is locked

~root で動作します:

[root@node02 ~]# sqlite3 stats2.sqlite 'create table if not exists timeBeginDB(target text UNIQUE NOT NULL,inserted int);'
[root@node02 ~]# 
4

2 に答える 2

1

SGE で行ったテストからlockfile、クラスターでは機能しないようです。ただし、機能しているように見えるのは、 bash-hackersで説明されている単純なmkdirロックです。

#!/bin/sh
DIR=/commun/data/
LOCK=$DIR/_tmp.idp448.lock
until mkdir $LOCK ; do
    sleep 4
done
(date ; hostname) >> $DIR/sge-test
rmdir $LOCK
whoami

ではlockfile、sge-test ファイルで報告される日付は互いに非常に近いものです。

于 2012-11-23T09:38:00.263 に答える