我试图找到rm -rf一个文件夹,并得到“设备或资源繁忙”。
在 Windows 中,我会使用 LockHunter 来解决这个问题。什么是 linux 等价物?(请给出一个简单的“解锁此”方法作为答案,而不是像这样的完整文章。虽然它们很有用,但我目前只对 ASimpleMethodThatWorks™ 感兴趣)
我经常看到程序指定pid和lock文件。而且我不太确定他们做什么。
比如编译nginx的时候:
--pid-path=/var/run/nginx.pid \
--lock-path=/var/lock/nginx.lock \
Run Code Online (Sandbox Code Playgroud)
有人可以对此有所了解吗?
使用flock,多个进程可以同时拥有一个共享锁,或者等待获取一个写锁。我如何获得这些进程的列表?
也就是说,对于给定的文件 X,理想情况下找到每个进程的进程 ID,该进程持有或正在等待文件锁定。尽管只是计算等待锁定的进程数,但这将是一个非常好的开始。
有时您必须确保同一时间只有一个 shell 脚本实例正在运行。
例如,通过 crond 执行的 cron 作业本身不提供锁定(例如默认的 Solaris crond)。
实现锁定的常见模式是这样的代码:
#!/bin/sh
LOCK=/var/tmp/mylock
if [ -f $LOCK ]; then            # 'test' -> race begin
  echo Job is already running\!
  exit 6
fi
touch $LOCK                      # 'set'  -> race end
# do some work
rm $LOCK
Run Code Online (Sandbox Code Playgroud)
当然,这样的代码有竞争条件。有一个时间窗口,其中两个实例的执行都可以在第 3 行之后才能访问$LOCK文件。
对于 cron 作业,这通常不是问题,因为两次调用之间有几分钟的间隔。
但是事情可能会出错——例如,当锁定文件在 NFS 服务器上时——挂起。在这种情况下,多个 cron 作业可以在第 3 行阻塞并排队。如果NFS服务器再次处于活动状态,那么你已经惊群并行运行的作业。
在网上搜索我发现工具lockrun似乎是该问题的一个很好的解决方案。使用它,您可以运行一个需要像这样锁定的脚本:
$ lockrun --lockfile=/var/tmp/mylock myscript.sh
Run Code Online (Sandbox Code Playgroud)
您可以将其放在包装器中或从您的 crontab 中使用它。
lockf()如果可用,它使用(POSIX) 并回退到flock()(BSD)。并且lockf()对 NFS …
我有一个可以使用其他应用程序更改的文本文件(例如openoffice)。但是,当我尝试使用 更改并保存它gedit时,出现以下错误gedit:
Could not save the file /media/sf_Ubuntu/BuildNotes.txt.
Unexpected error: Error renaming temporary file: Text file busy
Run Code Online (Sandbox Code Playgroud)
BuildNotes.txt 的权限如下:
-rwxrwx--- 1 root vboxsf  839 2012-10-26 12:08 BuildNotes.txt
Run Code Online (Sandbox Code Playgroud)
用户 ID 是:
m@m-Linux:/media/sf_Ubuntu$ id
uid=1000(m) gid=1000(m) groups=4(adm),20(dialout),24(cdrom),46(plugdev),105(lpadmin),119(admin),122(sambashare),1000(m),1001(vboxsf)
Run Code Online (Sandbox Code Playgroud)
有什么问题,我该如何解决?
如果我有命令
$ ./script >> file.log
Run Code Online (Sandbox Code Playgroud)
被调用两次,第二次调用发生在第一个结束之前,会发生什么?
第一次调用是否获得了输出文件的排他锁?如果是这样,第二个脚本是否在尝试写入时失败,或者 shell 是否接受输出(允许脚本结束)并抛出错误?
或者日志文件被写入两次?
2013 年 8 月 19 日,Randal L. Schwartz发布了这个shell 脚本,旨在确保在 Linux 上“只有一个 [该] 脚本实例正在运行,没有竞争条件或必须清理锁定文件”:
#!/bin/sh
# randal_l_schwartz_001.sh
(
    if ! flock -n -x 0
    then
        echo "$$ cannot get flock"
        exit 0
    fi
    echo "$$ start"
    sleep 10 # for testing.  put the real task here
    echo "$$ end"
) < $0
Run Code Online (Sandbox Code Playgroud)
它似乎像宣传的那样工作:
$ ./randal_l_schwartz_001.sh & ./randal_l_schwartz_001.sh
[1] 11863
11863 start
11864 cannot get flock
$ 11863 end
[1]+  Done                    ./randal_l_schwartz_001.sh
$
Run Code Online (Sandbox Code Playgroud)
以下是我的理解:
<其自身内容的副本(即 from …进程完成后,我看到锁文件没有被删除?有什么理由flock保留文件吗?另外如何flock知道是否获得了锁?
这是来自crontab文件的示例
* * * * * flock python <script_name>.py
Run Code Online (Sandbox Code Playgroud)