有什么好方法可以知道 Linux 计算机的安装时间?
我能想到的任何解决方案都将基于stat -c %y
,例如。
stat --format %y /etc/os-release /etc/skel
2022-04-06 12:00:18.402055811 +0200
2022-04-06 12:00:19.895055839 +0200
但使用修改时间有明显的缺点,出生日期可能不受支持。
有什么好方法可以知道 Linux 计算机的安装时间?
我能想到的任何解决方案都将基于stat -c %y
,例如。
stat --format %y /etc/os-release /etc/skel
2022-04-06 12:00:18.402055811 +0200
2022-04-06 12:00:19.895055839 +0200
但使用修改时间有明显的缺点,出生日期可能不受支持。
命令realpath
实用程序现在由 POSIX 在其第 8 期 (2024) 中定义:realpath — 解析路径名
真实路径 [-E|-e] 文件
realpath 实用程序将规范化文件操作数指定的路径名,如下所示:
如果使用指定路径名作为其第一个参数的函数调用
realpath()
成功,则规范化路径名应为该调用返回的路径名realpath()
。否则:
如果指定了-e选项,规范化将失败。
如果指定了-E
realpath()
选项,则如果以指定路径名作为其第一个参数对函数的调用遇到 [ENOENT] 以外的错误情况,则规范化将失败;如果调用遇到 [ENOENT] 错误,realpath 将扩展所有遇到的符号链接,尝试使用 XBD 4.16 路径名解析中指定的算法来解析指定的路径名,但应忽略任何<slash>
不是前导<slash>
字符的尾随字符。如果此扩展成功,并且扩展路径名的路径前缀解析为现有目录,则规范化路径名应为扩展路径名。在所有其他情况下,规范化都将失败。如果扩展路径名不为空、不以 开头<slash>
,并且只有一个路径名组件,则应将其视为具有路径前缀“./
”。如果未指定任何选项,realpath 将以未指定的方式规范化指定的路径名,使得生成的绝对路径名不包含任何引用符号链接类型文件的组件,也不包含任何点或点点组件。
成功规范化后,realpath 会将规范化的路径名(后跟一个
<newline>
字符)写入标准输出。如果规范化失败,或者规范化的路径名为空,则不会向标准输出写入任何内容,而会向标准错误写入诊断消息,并且 realpath 会以非零状态退出。
[...]
我的问题是:至少 GNU 和 Solaris 已经支持-e
该选项,但我在检查过的所有版本(macOS、FreeBSD、Solaris、GNU)中realpath
都找不到该选项的提及。OpenGroup 发明了它吗?-E
realpath
重新安装 Linux 机器后,我无意中wipefs -a
在安装程序 pendrive 上运行了:
$ wipefs -a /dev/sd?
/dev/sda: 8 bytes were erased at offset 0x00010040 (btrfs): 5f 42 48 52 66 53 5f 4d
/dev/sdb: 8 bytes were erased at offset 0x00010040 (btrfs): 5f 42 48 52 66 53 5f 4d
...
/dev/sdw: 8 bytes were erased at offset 0x00010040 (btrfs): 5f 42 48 52 66 53 5f 4d
/dev/sdx: 8 bytes were erased at offset 0x00010040 (btrfs): 5f 42 48 52 66 53 5f 4d
/dev/sdy: 5 bytes were erased at offset 0x00008001 (iso9660): 43 44 30 30 31
/dev/sdy: 2 bytes were erased at offset 0x000001fe (dos): 55 aa
/dev/sdy: 8 bytes were erased at offset 0x00000200 (gpt): 45 46 49 20 50 41 52 54
/dev/sdy: calling ioctl to re-read partition table: Success
由于wipefs
输出包含偏移量和已删除字节的内容,因此似乎可以恢复/dev/sdy
。您将如何做?
我有一个 RHEL 8 工作站,其中托管一个应用程序,其 GUI 可通过 https 访问。
当应用程序启动时,它会创建一些/tmp
具有随机名称和.sock
后缀的套接字文件:
$ ls -l /tmp/*.sock
srwx------ 1 app app 0 Dec 21 13:30 /tmp/supervisor-358513b0f6222d2339e4ab66d30b0037.sock
srwx------ 1 app app 0 Dec 21 13:31 /tmp/mongodb-358513b0f6222d2339e4ab66d30b0037.sock
srwx------ 1 app app 0 Dec 21 13:31 /tmp/livegui-358513b0f6222d2339e4ab66d30b0037.sock
$ file /tmp/*.sock
/tmp/supervisor-358513b0f6222d2339e4ab66d30b0037.sock: socket
/tmp/mongodb-358513b0f6222d2339e4ab66d30b0037.sock: socket
/tmp/livegui-358513b0f6222d2339e4ab66d30b0037.sock: socket
更新:套接字文件名的“随机”部分实际上是应用程序安装路径的 MD5。
当人们频繁使用该应用程序时,该应用程序可以正常运行数周/数月,但是当几天内无人连接到该应用程序时,它就会停止响应;当这种情况发生时,我可以看到文件.sock
在应用程序进程仍在运行时被删除......
有没有什么办法可以防止删除某些文件/tmp
?
我必须将一些文件/目录从几个人共享的目录移动到另一台计算机。我必须移动的元素是一些目录、一些子目录、子目录中的一些特定文件等……有点乱 ^^
我正在尝试应用https://serverfault.com/a/788007/154366中的方法,但不知何故失败了。
这是我的测试设置(我试图使其具有足够的代表性,以便能够理解其中的大部分复杂之处,rsync --filter=merge
以便我可以将它应用到我的实际问题中):
#!/bin/bash
mkdir -p /tmp/test/{a/b,b/{a,b},c,.d}
touch /tmp/test/{f.txt,.f.txt,{a/b,b,b/{a,b},c,.d}/f.txt,b/.f.txt}
tree -a /tmp/test
/tmp/test
├── a
│ └── b
│ └── f.txt
├── b
│ ├── a
│ │ └── f.txt
│ ├── b
│ │ └── f.txt
│ ├── .f.txt
│ └── f.txt
├── c
│ └── f.txt
├── .d
│ └── f.txt
├── .f.txt
└── f.txt
现在我想使用单个rsync -av
命令将以下项目从 复制/tmp/test
到/tmp/filt
:
./a
目录./b/b
目录./b
目录的所有文件和点文件直接子目录./
目录的所有文件(非点文件)的直接子目录我预期的“副本”在此处标记=>
:
/tmp/test/ => /tmp/filt/
/tmp/test/a/ => /tmp/filt/a/
/tmp/test/a/b/ => /tmp/filt/a/b/
/tmp/test/a/b/f.txt => /tmp/filt/a/b/f.txt
/tmp/test/b/ => /tmp/filt/b/
/tmp/test/b/a/
/tmp/test/b/a/f.txt
/tmp/test/b/b/ => /tmp/filt/b/b/
/tmp/test/b/b/f.txt => /tmp/filt/b/b/f.txt
/tmp/test/b/f.txt => /tmp/filt/b/f.txt
/tmp/test/b/.f.txt => /tmp/filt/b/.f.txt
/tmp/test/c/
/tmp/test/c/f.txt
/tmp/test/.d/
/tmp/test/.d/f.txt
/tmp/test/f.txt => /tmp/filt/f.txt
/tmp/test/.f.txt
因此我编写了以下filter.txt
文件以便与 rsync 一起使用它--filter=merge
:
+ /[!.]*
+ /a/
+ /a/**
+ /b/
+ /b/b/
+ /b/b/**
- /b/*/
+ /b/*
- /**
但是当我运行命令时:
rsync -av --dry-run --filter='merge filter.txt' /tmp/test /tmp/filt/
我得到:
sending incremental file list
test/
sent 74 bytes received 20 bytes 188.00 bytes/sec
total size is 0 speedup is 0.00 (DRY RUN)
注意:当然,该/tmp/filt
目录不存在,因此缺少输出与它无关。
我做错什么了?
当我从 Linux RHEL 8 连接到远程 macOS Sonoma 时ssh -J user@portal user@mac
,连接后我运行vim somefile
,在退出 Vim 后,我在“页面”的左上角以及 shell 提示符下得到了一些多余的字符:
[>4;m
注意:我无法正确捕获这些字节,我不知道该怎么做
这不是我第一次遇到这个问题,使用不同的本地/远程操作系统组合(Solaris/FreeBSD/AIX/Linux/macOS),但以前我只需要terminfo
在远程 NIX 上安装软件包即可解决这个问题。
不过,在 macOS Sonoma 上,RHEL 8 使用的 terminfoxterm-256color
已经在 中/usr/share/terminfo/78/xterm-256color
,更改TERM
为xterm
没有帮助。
对于如何修复该问题您有什么想法吗?
我的任务是为一些高性能 RHEL8 工作站和服务器设置自动更新。
我不喜欢这样做,因为无人值守的更新可能会出很多问题,但是,似乎引发错误和数据丢失比让计算机至少每周不更新“更安全”……
目标计算机使用zfs
和kmod-nvidia
(分别来自 zfsonlinux.org 和www.elrepo.org);两个 RPM 都需要匹配的内核“版本”,因此我想要实施的第一个安全措施是确保当有新内核可用时,安装的zfs
和kmod-nvidia
(或其可用更新)与其兼容。
例如,现在有一个新的内核:
$ sudo dnf update --assumeno
Updating Subscription Management repositories.
Last metadata expiration check: 0:57:59 ago on Thu 28 Nov 2024 12:08:30 AM CET.
Dependencies resolved.
==========================================================================================================================================================
Package Architecture Version Repository Size
==========================================================================================================================================================
Installing:
kernel x86_64 4.18.0-553.30.1.el8_10 rhel-8-for-x86_64-baseos-rpms 10 M
Upgrading:
bpftool x86_64 4.18.0-553.30.1.el8_10 rhel-8-for-x86_64-baseos-rpms 11 M
kernel-headers x86_64 4.18.0-553.30.1.el8_10 rhel-8-for-x86_64-baseos-rpms 12 M
kernel-tools x86_64 4.18.0-553.30.1.el8_10 rhel-8-for-x86_64-baseos-rpms 11 M
kernel-tools-libs x86_64 4.18.0-553.30.1.el8_10 rhel-8-for-x86_64-baseos-rpms 10 M
pam x86_64 1.3.1-36.el8_10 rhel-8-for-x86_64-baseos-rpms 748 k
python3-perf x86_64 4.18.0-553.30.1.el8_10 rhel-8-for-x86_64-baseos-rpms 11 M
webkit2gtk3 x86_64 2.46.3-2.el8_10 rhel-8-for-x86_64-appstream-rpms 28 M
webkit2gtk3-jsc x86_64 2.46.3-2.el8_10 rhel-8-for-x86_64-appstream-rpms 4.5 M
Installing dependencies:
kernel-core x86_64 4.18.0-553.30.1.el8_10 rhel-8-for-x86_64-baseos-rpms 43 M
kernel-devel x86_64 4.18.0-553.30.1.el8_10 rhel-8-for-x86_64-baseos-rpms 24 M
kernel-modules x86_64 4.18.0-553.30.1.el8_10 rhel-8-for-x86_64-baseos-rpms 36 M
Transaction Summary
==========================================================================================================================================================
Install 4 Packages
Upgrade 8 Packages
Total download size: 202 M
安装的kmod-nvidia
接缝兼容:
$ sudo dnf repoquery --requires kmod-nvidia | awk '$1 == "kernel"'
kernel >= 4.18.0-553.el8_10
但我不知道该说些什么,因为其 RPM 中zfs
没有提到任何要求:kernel
$ sudo dnf repoquery --requires zfs
Updating Subscription Management repositories.
/bin/sh
/usr/bin/python3.6
libblkid.so.1()(64bit)
libblkid.so.1(BLKID_1.0)(64bit)
libc.so.6(GLIBC_2.28)(64bit)
libcrypto.so.1.1()(64bit)
libdl.so.2()(64bit)
libm.so.6()(64bit)
libm.so.6(GLIBC_2.2.5)(64bit)
libnvpair.so.3()(64bit)
libnvpair3(x86-64) = 2.1.15-1.el8
libnvpair3(x86-64) = 2.1.15-2.el8
libpthread.so.0()(64bit)
libpthread.so.0(GLIBC_2.12)(64bit)
libpthread.so.0(GLIBC_2.2.5)(64bit)
libpthread.so.0(GLIBC_2.3.2)(64bit)
librt.so.1()(64bit)
librt.so.1(GLIBC_2.3.3)(64bit)
libtirpc.so.3()(64bit)
libudev.so.1()(64bit)
libudev.so.1(LIBUDEV_183)(64bit)
libuuid.so.1()(64bit)
libuuid.so.1(UUID_1.0)(64bit)
libuutil.so.3()(64bit)
libuutil3(x86-64) = 2.1.15-1.el8
libuutil3(x86-64) = 2.1.15-2.el8
libz.so.1()(64bit)
libzfs.so.4()(64bit)
libzfs5(x86-64) = 2.1.15-1.el8
libzfs5(x86-64) = 2.1.15-2.el8
libzfs_core.so.3()(64bit)
libzpool.so.5()(64bit)
libzpool5(x86-64) = 2.1.15-1.el8
libzpool5(x86-64) = 2.1.15-2.el8
openssl
rtld(GNU_HASH)
sysstat
systemd
util-linux
zfs-kmod = 2.1.15
如何验证已安装的(或可用的更新)zfs
是否与新内核兼容?
我正在寻找一种方法来消除某些附加代码以.bashrc
自动强制加载其环境的安装程序的不良行为。这个问题出现了几次,主要是在 Conda 上,在某些情况下,用户最终会使用一个损坏的帐户阻止他们再登录。
我试图在 .bashrc 的末尾添加一个未关闭的 here-document,如下所示:
# .bashrc
#...
: <<'__END__'
哪个有效,但会产生解析错误烦人的警告。
什么是一种干净的方法(不使 .bashrc 只读)?
我有一个适用于 IRIX/Linux/macOS/FreeBSD 的安装程序/更新程序脚本,我想将其兼容性扩展到 Solaris。
我已经修复了一些不符合 POSIX 的部分,除了crontab
像这样生成的部分:
printf '%s\n' MAILTO=me@xyz.org '*/15 * * * * /path/cmd' | crontab -
# crontab -l # (on Linux/macOS/FreeBSD)
MAILTO=me@xyz.org
*/15 * * * * /path/cmd
注意: /path/cmd
除非检测到问题,否则是安静的
代码在 Solaris 上失败有以下三个原因:
MAILTO=
引发语法错误*/15
引发语法错误crontab -
尝试打开名为-
我用以下方法修复了 #2和#3:
printf '%s\n' '0,15,30,45 * * * * /path/cmd' | crontab
# crontab -l
0,15,30,45 * * * * /path/cmd
现在我不知道如何转换MAILTO=
零件。从 POSIX 转发电子邮件的方法是crontab
什么?
感谢@ilkkachu和@Gilles'SO-stopbeingevil'指针,这就是我决定以符合 POSIX的方式模拟crontab行为的方式:MAILTO
# crontab -l
0,15,30,45 * * * * out=$(/path/cmd 2>&1); [ -n "$out" ] && printf \%s\\n "$out" | mailx -s "Cron <$LOGNAME@$(uname -n)>" me@xyz.org
但是,这个解决方案有一个潜在的问题:如果printf
不是内置的 shell并且输出太大,那么它将失败并出现类似的问题。Argument list too long