lockfile-create 在 bash 脚本中不起作用

Posted

技术标签:

【中文标题】lockfile-create 在 bash 脚本中不起作用【英文标题】:lockfile-create does not work in bash script 【发布时间】:2013-12-04 01:59:33 【问题描述】:

这可能是一个非常简单的问题,但我不明白为什么会这样。当我调用

lockfile-create --use-pid --retry 0 /tmp/my_lock_file

它返回 0,并且下次运行时它会返回一些其他代码(4),因为它已经创建了锁定文件。但是当我将相同的代码包装在 bash 脚本文件中时,它总是返回 0 作为退出代码。有人知道为什么它不起作用吗?

更新:完整的 bash 文件内容

#! /bin/bash

LOCK=alert

lockfile-create --use-pid --retry 0 $LOCK
LOCK_CREATED=$?
echo "Lock file creation status $LOCK_CREATED"

这就是我运行它的方式 ./alert.sh。

【问题讨论】:

脚本中除了这一行还有其他内容吗? 那么它应该可以按预期工作。脚本的退出状态是它执行的最后一个命令的退出状态。 #! /bin/bash LOCK=alert lockfile-create --use-pid --retry 0 $LOCK LOCK_CREATED=$? echo "锁定文件创建状态 $LOCK_CREATED" 是文件中的内容。很抱歉格式混乱 请更新您的问题,在 cmets 中阅读代码很困难。 当前目录中是否存在名为alert 的文件?请注意,alertalert.sh 将是不同的文件,尽管这似乎不是问题的根源。 【参考方案1】:

但是当我将相同的代码包装在 bash 脚本文件中时,它总是 返回 0 作为退出代码。

这是因为当你再次执行脚本时,执行脚本的进程的 PID 发生了变化。因此,--use-pid 标志导致lockfile-create 认为需要覆盖锁定文件。

根据您的用例,您可能希望摆脱 --user-pid 标志。但是,在这种情况下,您需要确保自己清理锁定文件。

引用man lockfile-create:

   -p, --use-pid
       Write the parent process id (PPID) to the lockfile whenever a lock‐
       file  is created, and use that pid when checking a lock's validity.
       See the lockfile_create(3)  manpage  for  more  information.   This
       option  applies  to lockfile-create and lockfile-check.  NOTE: this
       option will not work correctly between machines sharing a  filesys‐
       tem.

您可以通过尝试在同一脚本中再次创建日志文件来验证您观察到的行为:

#! /bin/bash
LOCK=alert

lockfile-create --use-pid --retry 0 $LOCK
LOCK_CREATED=$?
echo "Lock file creation status $LOCK_CREATED"
lockfile-create --use-pid --retry 0 $LOCK
LOCK_CREATED=$?
echo "Lock file creation status $LOCK_CREATED"

【讨论】:

是的,很好的解释。它解决了我的问题,我不想出于任何原因使用 PID。感谢 devnull

以上是关于lockfile-create 在 bash 脚本中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

bash 脚本从 bash 脚本添加 git 凭据

windows怎么提取bash脚本

在 bash 脚本中,我有一组参数要传递给另一个 bash 脚本。我该怎么做? [复制]

将 Python 脚本的返回值存储在 bash 脚本中

在 bash 脚本中嵌入简短的 python 脚本

在 bash 脚本中导出数组