小编Adr*_*onk的帖子

在流水线中更早地获取命令的 PID

我正在编写一个 bash 脚本,用于inotifywait监视目录并在检测到更改时启动操作。就像是:

inotifywait -m ... | while read f; do something; done
Run Code Online (Sandbox Code Playgroud)

由于inotifywait不会自行终止,因此该脚本不会停止。

所以我的计划是获取 inotifywait 进程的 PID,将其保存到一个文件中,然后让不同的进程将其杀死,例如:

inotifywait -m ... | { echo ??PID?? > pid-file; while ... }
Run Code Online (Sandbox Code Playgroud)

但我不知道如何获得PID。有没有简单的方法来实现这一目标?另一种方法是将 shell 脚本的 PID 保存$$到文件中并终止整个 shell 脚本,但我想在 while 循环后进行一些清理。

我试过使用coproc,我认为它会起作用,但它似乎比必要的更复杂。

bash pipe pid

11
推荐指数
1
解决办法
3692
查看次数

bash 中进程替换的输出重复 ^A 字符

我最近写了一个脚本,我想在将它作为参数传递给另一个命令之前用 sed 修改文件:

$ some-command <(sed $'s\x01foo\x01bar\x01g' some-file)
Run Code Online (Sandbox Code Playgroud)

这失败并出现错误:

sed: -e expression #1, char 8: unknown option to `s'
Run Code Online (Sandbox Code Playgroud)

经过一些实验,我发现 bash在调用 sed 之前复制了^A( \x01) 字符:

$ cat -v <(echo $'\x01')
^A^A
Run Code Online (Sandbox Code Playgroud)

^B(或其他)字符不会发生这种情况。

$ cat -v <(echo $'\x02')
^B
Run Code Online (Sandbox Code Playgroud)

这种行为记录在哪里?这是 ^A 用于模糊功能的某些默认设置的结果吗?

我在我可以访问的四个不同版本的 bash 中看到了这一点:4.1.2、4.2.25、4.2.46 (linux) 和 4.3.42 (cygwin)

bash

6
推荐指数
1
解决办法
178
查看次数

将 PV 映像安装为只读循环设备(同样 - 它曾经有效)

几年前,我用更大的硬盘升级了我的上网本。我想保留旧硬盘上的内容,以防万一我还想删除它。

所以我将旧硬盘复制到新硬盘上的文件中:

dd if=/dev/sdd5 of=~/fw-disk-image/fw-sdd5-linux-lvm-partition.raw
Run Code Online (Sandbox Code Playgroud)

我编写/复制了一个脚本,用于将lvms作为只读文件系统安装在该分区上:

losetup -r /dev/loop1 ~/fw-disk-image/fw-sdd5-linux-lvm-partition.raw

pvscan
vgscan
vgchange -a y fw

cd /mnt/fw
for i in root tmp usr var home
  do
    mount -o ro /dev/fw/$i $i
  done
Run Code Online (Sandbox Code Playgroud)

现在这工作了很长一段时间,现在突然在vgchange -a y fw命令中失败了:

# vgchange -a y fw
  Error writing device /dev/loop1 at 4096 length 512.
  bcache_invalidate: block (4, 0) still dirty
  Failed to write mda header to /dev/loop1 fd -1
  Failed to update old PV extension headers in VG fw.
  Volume group "fw" …
Run Code Online (Sandbox Code Playgroud)

lvm loop-device

6
推荐指数
1
解决办法
1870
查看次数

标签 统计

bash ×2

loop-device ×1

lvm ×1

pid ×1

pipe ×1