在我的笔记本电脑上,CD/DVD 驱动器的弹出按钮位于一个非常不幸的位置,我每天敲打它十几次,托盘弹出。我找到了许多似乎对其他人有用的解决方案:
来自man eject:
-i 上 | 1 | 关闭 | 0
此选项控制硬件弹出按钮的锁定。启用后,按下按钮时不会弹出驱动器。当您将笔记本电脑放在包或手提箱中并且不希望在无意中按下按钮时将其弹出时,这很有用。
这似乎正是我所需要的。eject -i on成功返回:
CD-Drive may NOT be ejected with device button
Run Code Online (Sandbox Code Playgroud)
但是,按下设备按钮仍会弹出驱动器。至于建议中的 另一个答案调用
echo 1 > /proc/sys/dev/cdrom/lock
Run Code Online (Sandbox Code Playgroud)
也没有帮助,lock已经包含 1。来自的信息
/proc/sys/dev/cdrom/info表明锁定是可能的:
drive name: sr0
drive speed: 24
drive # of slots: 1
Can close tray: 1
Can open tray: 1
Can lock tray: 1
Can change speed: 1
Can select disk: 0
Can read multisession: 1
Can read MCN: 1 …Run Code Online (Sandbox Code Playgroud) $ cat /proc/locks 1:POSIX 建议写 458 03:07:133880 0 EOF 2:FLOCK ADVISORY WRITE 404 03:07:133879 0 EOF
这些字段是:序号(1)、类型(2)、模式(3)、类型(4)、pid(5)、maj:min:inode(6) start(7) end(8)。
问题:如何找到被锁定的对应文件?
我计划进行复杂的文件共享设置,并希望确保不会破坏文件锁定。(想在同一数据上使用绑定挂载、nfs、nfs over rdma(InfiniBand 文件共享)和 virtfs(kvm 虚拟机直通文件共享)。)
我刚开始进行健全性检查,只是用一个 nfs 客户端测试 nfs 服务器。两个系统上的最新 Arch,nfs-utils 1.3.2-6,内核 4.1.6-1。
我看到了意想不到的结果。在 nfs 服务器上:
server exports with: /test 192.168.0.0/16(rw,sync,no_subtree_check,
no_root_squash)
client mount shows: 192.168.1.2:/test on /test type nfs4 (rw,noatime,vers=4.2,
rsize=524288,wsize=524288,namlen=255,hard,proto=tcp,port=0,timeo=600,
retrans=2,sec=sys,clientaddr=192.168.1.3,local_lock=none,addr=192.168.1.2)
Run Code Online (Sandbox Code Playgroud)
在 /test 中,我有一个以lockFile内容命名的脚本:
#!/bin/bash
filename="lockedFile"
exec 200>$filename
flock -n 200 || exit 1
pid=$$
while true; do
echo $pid 1>&200
done
Run Code Online (Sandbox Code Playgroud)
如果我在 nfs 服务器上使用两个终端:
1: ./lockFile
2: ./lockFile
Run Code Online (Sandbox Code Playgroud)
然后,终端 1 迅速用它的 pid 填满一个文件,终端 2 立即退出。一切都在预料之中。
但是,如果我在 nfs 服务器和客户端上分别运行一个终端:
server: ./lockFile
client: ./lockFile
Run Code Online (Sandbox Code Playgroud)
两人开心地奔跑,出乎意料。
在此配置中,我的 …
我想通过文件锁同步两个 Bash 脚本。这该怎么做?Zsh 有zsystem flock调用,但是 Bash 也可以使用更“shellish”的方法吗?
打开伪终端的主部分后
int fd_pseudo_term_master = open("/dev/ptmx",O_RDWR);
有/dev/pts/[NUMBER]创建的文件,代表slave他伪终端的部分。
像我这样无知的人可能会想象,做完ptsname(fd_pseudo_term_master,filename_pseudo_term_slave,buflen);一个人就应该简单地
做int fd_pseudo_term_slave = open(filename_pseudo_term_slave,O_RDWR);和做好。
但是,必须有一个非常重要的“锁定”伪终端从属用例,因为为了使事情简单,在进行open调用之前,必须使用man 3 unlockpt来“解锁”。
我无法找出这个用例是什么?伪终端初始锁定需要什么?代码实现了什么(取自 libc)
/* Unlock the slave pseudo terminal associated with the master pseudo
terminal specified by FD. */
int
unlockpt (int fd)
{
#ifdef TIOCSPTLCK
int save_errno = errno;
int unlock = 0;
if (ioctl (fd, TIOCSPTLCK, &unlock))
{
if (errno == EINVAL)
{
errno = save_errno;
return 0;
}
else
return -1; …Run Code Online (Sandbox Code Playgroud) 我有一个定期通过 cron 执行的脚本(每隔几分钟)。然而,脚本不应并行运行多次,有时运行时间会更长,因此我想实现一些锁定,即如果前一个实例已经在运行,请确保脚本提前终止。
根据各种建议,我有一个看起来像这样的锁定:
lock="/run/$(basename "$0").lock"
exec {fd}<>"$lock"
flock -n $fd || exit 1
Run Code Online (Sandbox Code Playgroud)
这应该调用 exit 1 以防脚本的另一个实例仍在运行。
现在问题来了:似乎有时即使脚本已经终止,陈旧的锁仍然存在。这实际上意味着 cron 永远不会再次执行(直到下次重新启动或删除锁定的文件),这当然不是我想要的。
我发现有列出现有文件锁的 lslocks 命令。它显示了这一点:
(unknown) 2732 FLOCK WRITE 0 0 0 /run...
Run Code Online (Sandbox Code Playgroud)
进程(在这种情况下为 2732)不再存在(例如在 ps aux 中)。我也不清楚为什么它不显示完整的文件名(即只有 /run...)。lslocks 有一个参数 --notrucate 在我看来它可能会避免截断文件名,但这不会改变输出,它仍然是 /run...
所以我有多个问题:
我安装了 CentOS 和 cPanel。我想锁定某些文件(例如.ftpquota)以免通过 FTP 删除。我试图将所有权更改为root:rootorroot:lock但它不起作用;也没有将模式更改为 0。
如何锁定.ftpquota文件?
我想编写一个长时间运行的 shell 脚本,以便一次只能运行一个副本。如果脚本崩溃,我希望脚本的新调用不会被崩溃调用的锁所阻止。
实用程序lockfile-*集是否适合使用?在脚本中使用它们时是否有可能出现竞争条件?
是否--use-pid解除手册页上提到的 5 分钟限制?我的脚本运行时间要长得多。
我在 Amazon EC2 上使用 Ubuntu 10.10 实例;没有 NFS 或类似的东西。
我认为锁、互斥锁、信号量用于同步多个(线程或进程?)以同时访问某些内容。
这个“东西”必须是多个(线程或进程)之间的共享内存吗?
如果是,那是否意味着lock、mutex、semaphore只用于一个进程的多个线程,而不用于多个进程,因为多个进程不共享内存,而同一个进程的多个线程呢?
谢谢。
我需要实现一个锁定方案,以便多个进程可以共享一组资源,而“特殊”进程可以获得对该组资源的独占访问。
这些是批处理过程:在每个事务的开始,我建议获取适当的锁,并在最后释放它,无限期。
flock具有我需要的语义(LOCK_SH、LOCK_EX、LOCK_UN)。我使用 Perl Flock.pm 和一个虚拟文件对其进行了试验,该文件的唯一目的是被flock'ed 反对。我对它的速度有多慢感到有些惊讶,而且从时间花费的“顶部”看并不明显。(它不受 CPU 限制,即使正在执行的循环只包含 LOCK_SH 和 LOCK_UN。)我不想为过早优化感到内疚,但我想知道是否flock是管理共享和的标准方法独占访问 *nix 中的共享资源,即使共享资源不是实际文件,或者是否存在我不知道的其他设施。
更新:@msw 正确地猜到我(无意中)锁定了 NFS 文件而不是本地文件。使用本地文件完全消除了我看到的性能损失。我将问题悬而未决,以了解有关“文件锁定”是否真的是解决此类问题的最佳方法的更多信息。