SGE&x2B;sqlite3:错误:数据库已锁定

SGE&x2B;sqlite3:错误:数据库已锁定,sqlite,locking,cluster-computing,sungridengine,Sqlite,Locking,Cluster Computing,Sungridengine,我正在尝试运行一个在集群(SGE)中使用sqlite3的脚本 脚本使用创建锁,填充数据库并释放锁 $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 /com

我正在尝试运行一个在集群(SGE)中使用sqlite3的脚本

脚本使用创建锁,填充数据库并释放锁

  $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
从所有节点都可以看到/common/data//common/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用户身份登录群集的一个节点。以下简单命令失败: (/common/data/stats2.sqlite不存在)

它在~root中工作:

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

从我在SGE上所做的测试来看,
lockfile
似乎无法在集群上工作。不过,似乎有效的是在中介绍的一个简单的
mkdir


使用
lockfile
,sge测试文件中报告的日期彼此非常接近。

exec节点上的/common/data是NFS挂载吗

您可能会在GridEngine设置中看到SQLite“Error:database is locked”消息的一个原因是,SQLite希望使用fcntl锁,除非您同时在客户端和服务器上运行lockd,否则它在NFSv3上无法正常工作


我经常遇到这种情况,到目前为止,我所看到的每种情况都是在每个集群节点上启用lockd(或rpc.lockd,或nfslock,等等,取决于您的环境)服务,为共享文件系统提供服务的任何机器都将解决此问题。

I in{1..10}中的
是否会发生错误;do test.sh&done
?@choroba,我已经运行了循环,在stderr上没有错误。@Pierre:你用
(日期;主机名)
而不是
sqlite3
来验证
lockfile
是否真的有效了吗?我已经更新了我的问题,这是sqlite的问题,不是lockfile的问题
[root@node02 ~]# sqlite3 stats2.sqlite 'create table if not exists timeBeginDB(target text UNIQUE NOT NULL,inserted int);'
[root@node02 ~]# 
#!/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