如果我从当前日期中减去一个时间量,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
表达?
是否可以从头开始跟踪二进制文件,la tail -f
?
这在某些情况下很有用,例如,如果我scp
将文件发送到远程服务器,同时我想将其提供给另一个进程(是的,我知道我可以使用ssh
+cat
技巧)。
就我从 FM 上读到的而言,tail
是在考虑文本文件的情况下编写的。
是否有使用标准 posix 工具进行此类操作的简单方法?
我正在使用以下语句(简化版):
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
没有发送最后一个压缩块,因为它没有检测到任何新行,因为输入是二进制的。
我需要杀死一些作为 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)
但它的含义是模棱两可的 …
我了解到,使用 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 中它没有帮助。
在脚本中,我发现了一种处理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)
我找不到使用这种方法的任何有效理由。我失踪有什么原因吗?
我有一个带有多个分区的 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) 我想find
使用多个maxdepth
s执行搜索,具体取决于目录。
这可能吗?这似乎-maxdepth
是“全球性的”,但我很好奇是否有一些解决方法。
(我知道可以执行两个单独的命令,但使用一个会更快,并且可以使调用代码更简单)
我已经构建了 Linux 内核,但我想在不构建调试包的情况下完成它。
我知道可以CONFIG_DEBUG_INFO
通过scripts/config
(使用--set str ""
或--disable
)禁用标志 , 。
但是,我很困惑,因为当我调用时make deb-pkg
,标志被重置为值y
,以便构建包。
为什么会出现这种情况?