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-hackersmkdir中描述的简单锁。

#!/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 回答
1

/commun/data 是您的 exec 节点上的 NFS 挂载吗?

您可能会在 GridEngine 设置中看到 SQLite“错误:数据库已锁定”消息(通常有许多节点通过 NFS 写入共享文件系统)的一个原因是 SQLite 想要使用 fcntl 锁,而这根本不起作用除非您在客户端和服务器上都运行 lockd,否则就在 NFSv3 上

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

于 2013-04-25T23:24:08.230 回答