小编Mar*_*cus的帖子

为什么 GNU 日期的`-`(减号)解释与指定日期时的直观解释不同?

如果我从当前日期中减去一个时间量,GNU 日期的工作方式很直观:

date '+%F %R'; date '+%F %R' --date='- 1 hour'
2021-04-19 15:35
2021-04-19 14:35
Run Code Online (Sandbox Code Playgroud)

但是,当我使用日期作为操作数时,结果出乎意料:

$ date '+%F %R' --date='2000/1/2 03:04:05 - 1 hour'
2000-01-02 06:04

$ date '+%F %R' --date='2000/1/2 03:04:05 + 1 hour ago'
2000-01-02 02:04
Run Code Online (Sandbox Code Playgroud)

怎样date理解$date - 1 hour表达?

linux gnu date

12
推荐指数
2
解决办法
1315
查看次数

如何从头开始跟踪(a la "tail -f")二进制文件?

是否可以从头开始跟踪二进制文件,la tail -f

这在某些情况下很有用,例如,如果我scp将文件发送到远程服务器,同时我想将其提供给另一个进程(是的,我知道我可以使用ssh+cat技巧)。

就我从 FM 上读到的而言,tail是在考虑文本文件的情况下编写的。

是否有使用标准 posix 工具进行此类操作的简单方法?

tail text-processing binary

10
推荐指数
1
解决办法
1万
查看次数

刷新“tail -f”缓冲区?

我正在使用以下语句(简化版):

tail -f -c+1 <filename>
Run Code Online (Sandbox Code Playgroud)

为了将文件通过管道传输到进程。

不过,我发现最后有许多行没有通过管道连接。

一个具体的例子是管道一个 mysql 文件,并在到达结束时停止:

tail -f -c+1 mysqdump.sql | sed '/^-- Dump completed/ q0'
Run Code Online (Sandbox Code Playgroud)

这不起作用 - 转储的最后一行-- Dump completed [...]没有通过管道传输到 sed。

我的猜测是tail -f,在这种情况下,缓冲区仅在已满时才刷新。

有谁知道我该如何解决这个问题?

==================

我找到了原因 - 描述不完整(并且代码没有表现出行为)。

从压缩 (lzma) 文件进行管道传输时会出现问题:

tail -f -c+1 <filename.lzma> | lzma -d | sed '/^-- Dump completed/ q0'
Run Code Online (Sandbox Code Playgroud)

很可能tail没有发送最后一个压缩块,因为它没有检测到任何新行,因为输入是二进制的。

pipe tail

8
推荐指数
1
解决办法
1万
查看次数

有没有一种干净的方法来处理 sudo pkill 进程而不包括 sudo 进程?

我需要杀死一些作为 sudo 运行的进程,按全名匹配它们,并计算原始命令调用的次数。

对于每个进程,有两个进程:命令本身和sudo一个,但我可以解决这个问题:

$ sudo -b perf record sleep 100

$ pgrep -fa '/perf record'
2245700 /usr/lib/linux-tools/.../perf record sleep 100
Run Code Online (Sandbox Code Playgroud)

问题是,当我调用时sudo pkill,它会找到、杀死并计算自己:

$ sudo pkill -ef '/perf record' | wc -l
2
Run Code Online (Sandbox Code Playgroud)

在这种情况下,是否有一种简单的方法让 pkill 不包含自身?

我试过使用 pid 文件,这可能是可以接受的,但是缺少 pgrep/pkill 文档,而且它似乎不能以基本形式工作:

$ pgrep -f '/perf record' | tee /tmp/pids
$ sudo pkill -F /tmp/pids
 killed (pid 2249211)
Run Code Online (Sandbox Code Playgroud)

因为它只会杀死第一个。文档说:

       -F, --pidfile file
              Read PID's from file.  This option is perhaps more useful for pkill than pgrep.
Run Code Online (Sandbox Code Playgroud)

但它的含义是模棱两可的 …

kill pkill

6
推荐指数
2
解决办法
1293
查看次数

如何在空数据模式(`-z`)下将行的开头与 sed 匹配?

我了解到,使用 sed,可以通过使用空数据模式 ( -z):来匹配模式的第 n 次出现sed -z 's/foo/bar/2'

使用时如何匹配行首-z

如果我执行:

echo $'foo\nfoo\nfoo' | sed -z 's/^foo/baz/2'
Run Code Online (Sandbox Code Playgroud)

没有替换,因为^表示整个字符串的开头:

$ echo $'foo\nfoo\nfoo' | sed -z 's/^foo/baz/g'
baz
foo
foo
Run Code Online (Sandbox Code Playgroud)

在 Perl 中,有m正则表达式修饰符(当 slurping 时),但在 sed 中它没有帮助。

sed text-processing regular-expression

5
推荐指数
2
解决办法
668
查看次数

通过命令替换处理“systemctl status”的原因?

在脚本中,我发现了一种处理systemctl status输出的奇怪方法:

echo "$(systemctl status the_unit_name)" | grep -q 'Active: active'
Run Code Online (Sandbox Code Playgroud)

而不是显而易见的:

systemctl status the_unit_name | grep -q 'Active: active'
Run Code Online (Sandbox Code Playgroud)

我找不到使用这种方法的任何有效理由。我失踪有什么原因吗?

scripting bash shell-script systemd systemctl

5
推荐指数
2
解决办法
680
查看次数

为什么 fstrim 似乎不修剪 btrfs (+ecrypts) 上的数据块?

我有一个带有多个分区的 SSD 磁盘。其中之一是有一个 btrfs 卷,安装为/home,其中包含一个 ecryptfs 主目录。

当我修剪卷时,似乎 fstrim 不会修剪此类卷上的数据块 - 为什么?您可以在下面看到有关设置的所有信息,以及我遵循的步骤,以及注释。

$ cat /etc/fstab

UUID=xxx /               ext4    errors=remount-ro 0       1
UUID=yyy /media/vfio     ext4    defaults          0       2
UUID=zzz /home           btrfs   defaults          0       2
Run Code Online (Sandbox Code Playgroud)

$ mount | grep sda

/dev/sda5 on / type ext4 (rw,relatime,errors=remount-ro,data=ordered)
/dev/sda1 on /media/vfio type ext4 (rw,relatime,stripe=32721,data=ordered)
/dev/sda2 on /home type btrfs (rw,relatime,ssd,space_cache,subvolid=5,subvol=/)
Run Code Online (Sandbox Code Playgroud)

$ ls -la /home /home/myuser/.Private # summary

/home:
.ecryptfs
myuser

/home/myuser/.Private -> /home/.ecryptfs/myuser/.Private
Run Code Online (Sandbox Code Playgroud)

$ df -h

Filesystem              Size …
Run Code Online (Sandbox Code Playgroud)

filesystems btrfs ecryptfs trim fstrim

4
推荐指数
1
解决办法
1586
查看次数

`find` 是否支持多个 `maxdepth` 条件?

我想find使用多个maxdepths执行搜索,具体取决于目录。

这可能吗?这似乎-maxdepth是“全球性的”,但我很好奇是否有一些解决方法。

(我知道可以执行两个单独的命令,但使用一个会更快,并且可以使调用代码更简单)

find

3
推荐指数
2
解决办法
421
查看次数

为什么在构建 Linux 内核时会重置标志 `CONFIG_DEBUG_INFO`?

我已经构建了 Linux 内核,但我想在不构建调试包的情况下完成它。

我知道可以CONFIG_DEBUG_INFO通过scripts/config(使用--set str ""--disable)禁用标志 , 。

但是,我很困惑,因为当我调用时make deb-pkg,标志被重置为值y,以便构建包。

为什么会出现这种情况?

compiling ubuntu kernel debian linux-kernel

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