在我的 RasPi 板 Debian Linux 上,USB 麦克风偶尔会被锁定,以至于没有人可以使用它。麦克风有一个 LED,它通常会闪烁,当它锁定时,它会关闭。
该实用程序arecord对其进行了如下描述:
card 1: Device [DYNEX USB MIC Device], device 0:USB Audio [USB Audio]
Subdevices: 1/1
Subdevice #0: subdevice #0
Run Code Online (Sandbox Code Playgroud)
当麦克风停止工作时,arecord给出如下诊断:
> arecord -D plughw:1,0 > recording.wav
Recording WAVE 'stdin' : Unsigned 8 bit, Rate 8000 Hz, Mono
arecord: set_params:1145: Unable to install hw_params:
ACCESS: RW_INTERLEAVED
FORMAT: U8
etc...
Run Code Online (Sandbox Code Playgroud)
拔下和插入麦克风修复它,只是因为当前的下降迫使 RasPi 重新启动!不是理想的情况。
有没有办法从命令行或 C 可执行文件解决这个问题?
我还尝试使用ioctl(fd, USBDEVFS_RESET, 0)from 的输出lsusb来提供总线和设备编号。这会使 LED 重新亮起,但这太过分了。必须使用 alsamixer 重新设置设备。
我想根据锁定文件(/套接字文件)同步进程。这些文件只能由其创建者用户删除。
有很多选择:
/dev/shm
/var/lock
/run/lock
/run/user/<UID>
/tmp
为此目的的最佳位置是什么?上面位置的用途是什么?
我读到类似 Unix 的系统通常对文件 IO 使用咨询锁定,而不是 Microsoft 操作系统使用的强制锁定。如果我理解正确,强制锁定文件锁定是由操作系统本身强制执行的。但我没有得到建议锁定的直觉。以两个进程为例,说“A”和“B”正在处理文件“foo”。假设“A”写入“foo”,“B”从“foo”读取。在这种情况下,建议锁定如何工作?如果操作系统/文件系统没有对“foo”强制执行锁定,那么如何维护读取和写入的一致性?
我参考了以下链接,解决方案有效。
当您手动删除文件时,上述解决方案有效。但我有一个删除文件的 python 脚本(自动过程)。有时,当脚本尝试删除文件时,我会收到“设备或资源繁忙错误”。因此,我的脚本失败了。我不知道如何使用我的 python 脚本解决这个问题。
编辑: 脚本从日志服务器下载日志文件。然后这些文件由我的脚本处理。处理完成后,脚本会删除这些日志文件。我不认为设计有什么问题。
确切错误:
OSError: [Errno 16] Device or resource busy: '/home/johndoe/qwerty/.nfs000000000471494300000944'
Run Code Online (Sandbox Code Playgroud) 我有一个集群,其中包含一堆服务器,共享磁盘包含所有节点同时访问的 GFS 全局文件系统。
集群中的每个节点都运行相同的程序(一个 shell 脚本是主要的核心)。系统处理出现在几个输入目录中的文件,它的工作方式如下:
这一切都很好,但我想知道是否有更便宜(不太复杂)的解决方案也可以使用。我可能在考虑 NFS 或 SMB。
我使用 GFS 的原因有两个:
我像这样创建锁文件:
date '+%s:'${unid} > ${currlock}.${unid}
ln ${currlock}.${unid} ${currlock}
lockrc=$?
rm -f ${currlock}.${unid}
Run Code Online (Sandbox Code Playgroud)
其中$unid是唯一的会话标识符,$currlock是/gfs/tmp/lock.${file_to_process}
的美妙之ln处在于它是原子的,因此除了同时尝试同一件事的人之外,其他所有人都失败了。
所以,我想我要问的是:NFS 能满足我的需求吗?ln在 NFS 和 GFS 上是否以相同的方式可靠地工作?
我有一个 shell 脚本,它将由多个实例执行,如果一个实例访问一个文件并执行一些操作,我如何确保其他实例没有访问同一个文件并破坏数据?
我的问题不是关于控制并行执行,而是处理文件锁定或标记机制。
请求一些建议以继续。
我试着做
sudo apt update
Run Code Online (Sandbox Code Playgroud)
但得到:
无法获得锁 /var/lib/apt/lists/lock - open (11: 资源暂时不可用)
E: 无法锁定目录 /var/lib/apt/lists/
我正在尝试获取最新版本的 mongod。按照我发现的一些说明,我做了:
$ ps aux | grep apt
5019 0.0 0.0 14224 980 pts/0 S+ 02:52 0:00 grep --color=auto apt
Run Code Online (Sandbox Code Playgroud)
但我不知道我应该插入其中的哪一部分
kill -9 processnumber <id>
Run Code Online (Sandbox Code Playgroud)
使其工作。
哪个部分是ID,有什么办法可以防止这种情况再次发生?
我是 shell 脚本新手,这让我想知道为什么以下代码片段在 zsh 中不起作用,但在 bash 中却起作用?是否有相同片段的 zsh 等效项?我收到错误parse error near `200'
(
flock -e 200
echo "In critical section"
sleep 5
) 200>/tmp/blah.lockfile
echo "After critical section"
Run Code Online (Sandbox Code Playgroud)
上面的代码片段来自src: https: //stackoverflow.com/a/13551882/15087532
我试图找到一种根据给定参数锁定脚本的方法,但未能成功找到正确的答案。
我想要实现的是防止另一个用户基于某些参数运行脚本:因此,如果用户 A 使用参数执行脚本JOHN_DOE(例如:-d JOHN_DOE)并且用户 B 使用参数执行脚本-d ANNA_DOE,则它运行不会有任何问题,但如果用户B 尝试使用JOHN_DOE参数来执行它,而脚本的第一个实例尚未完成运行,则不允许用户 B 运行它。
有没有正确的方法来实现这一目标?
lock ×10
files ×4
shell-script ×3
bash ×2
concurrency ×2
linux ×2
apt ×1
fhs ×1
filesystems ×1
gfs ×1
inotify ×1
kill ×1
ln ×1
nfs ×1
open-files ×1
ps ×1
python ×1
raspberry-pi ×1
rhel ×1
usb-audio ×1
zsh ×1