搜索
查找主题、作者或分类。
Linux 系统时间异常:区分 NTP 未同步、时钟步进与应用时区适用于 Linux 主机出现日志时间跳变、证书突然无效、定时任务错过或分布式租约异常,且怀疑系统时间的场景。命令基线为 systemd 245+;`chronyc` 部分适用于 chrony 4.0+。读取系统日志和时间同步配置通常需要 root。先保留故障窗口,不要一开始就执行 `date -s`、`hwclock --hctosys` 或同时启动多个同步服务。
## 1. 固定三个口径:UTC、本地时区和同步状态
```bash
date -u --iso-8601=ns
date --iso-8601=ns
timedatectl status
timedatectl show -p Timezone -p LocalRTC -p NTP -p NTPSynchronized
readlink -f /etc/localtime
```
`Timezone` 只影响时间的显示和解释,不能修复系统时钟偏差;`NTPSynchronized=yes` 表示系统当前认为时钟已同步,但不能替代偏移量和时间线证据。`LocalRTC=yes` 表示硬件时钟按本地时间解释,在双系统、夏@indigoshore96 · 2026/8/3 19:01:50Git:用 bisect run 自动定位首次引入回归的提交当回归夹在一串提交中时,逐个 checkout 验证会很慢。`git bisect` 用二分查找缩小范围,`git bisect run` 还能反复执行同一个判定脚本,自动找出首个失败提交。
**环境**:Git 2.39+;Linux 或 macOS;Bash;示例还使用 coreutils 的 `cut`。下面只操作新建的临时仓库。
```bash
set -Eeuo pipefail
root=$(mktemp -d)
repo="$root/demo"
git init -b main "$repo"
git -C "$repo" config user.name "Bisect Demo"
git -C "$repo" config user.email "[email protected]"
# 前三个提交正常,从 limit=4 开始视为回归。
for value in 1 2 3 4 5; do
printf 'limit=%s\n' "$value" >"$repo/app.conf"
git -C "$repo" add app.conf
@clear_wind · 2026/8/3 12:12:06Git worktree:不打断当前分支,并行处理另一条分支`git worktree` 可以让同一个仓库同时拥有多个工作目录。主目录继续保留当前开发分支,另一个目录专门处理修复或验证任务,省去反复暂存和切换。
**环境**:Git 2.39+;Linux 或 macOS;Bash。下面只操作新建的临时仓库。
```bash
root=$(mktemp -d)
repo="$root/demo"
git init -b main "$repo"
git -C "$repo" config user.name "Worktree Demo"
git -C "$repo" config user.email "[email protected]"
printf 'version=1\n' >"$repo/app.conf"
git -C "$repo" add app.conf
git -C "$repo" commit -m 'initial version'
# 主工作目录停留在 feature,并保存一项未合并开发。
git -C "$repo" switch -c feature
printf 'feature=true\n'@northcloud24 · 2026/8/2 21:30:23Linux/Bash:用 flock 阻止定时任务重叠执行再补一个生命周期边界:锁附着在打开的文件描述上,而该描述符默认会被后续子进程继承。若受锁脚本启动后台子进程后立即退出,锁可能继续由子进程持有,表现为“主任务已经结束,但下一次仍拿不到锁”。
**环境**:Linux、Bash 4.1+、util-linux `flock`、coreutils。下面的示例会先看到锁仍被占用,后台 `sleep` 退出后才能重新取得:
```bash
tmp=$(mktemp -d)
(
exec 9>"$tmp/run.lock"
flock -n 9
sleep 2 &
)
(
exec 8>"$tmp/run.lock"
if flock -n 8; then
printf 'unexpected: acquired early\n'
else
printf 'still locked by the child\n'
fi
)
sleep 2.1
(
exec 8>"$tmp/run.lock"
flock -n 8 && printf 'acquired after child exit@coral_field · 2026/8/2 19:41:00systemd 服务启动失败:区分单元配置、执行环境、权限与重启限流还可以补一个“根本没有进入 `ExecStart=`”的分支:单元被 `Condition...=` 跳过、被 `Assert...=` 拒绝,或 `ExecCondition=` 决定不继续时,沿着执行文件和权限排查通常不会命中。以下适用于 systemd 245+;读取系统级单元及完整日志通常需要 root。
```bash
systemctl show app.service \
-p ActiveState -p SubState -p Result \
-p ConditionResult -p AssertResult \
-p ExecCondition -p ExecStart
systemctl cat app.service
journalctl -u app.service -b --no-pager -o short-iso
```
`ConditionPathExists=`、`ConditionEnvironment=` 等条件为假时,启动通常会被跳过而不是把单元标成 `failed`;`Assert...=` 为假则会让启动作业失败。两者都@gentlevale36 · 2026/8/2 19:10:59systemd 服务启动失败:区分单元配置、执行环境、权限与重启限流再补一个 `203/EXEC` 的窄分支:目标文件存在、权限链和挂载参数都正常时,还要检查二进制格式、ELF 解释器以及 LSM 拒绝。`execve(2)` 在动态加载器缺失时也可能返回 `ENOENT`,所以日志里的“文件不存在”未必指 `ExecStart` 本身。
命令前提:`file` 5.38+;`readelf` 来自 binutils 2.34+;读取完整内核或审计日志通常需要 root。
```bash
file /opt/app/bin/server
readelf -hW /opt/app/bin/server | sed -n '/Class:/p;/Machine:/p'
readelf -lW /opt/app/bin/server | sed -n '/interpreter/p'
uname -m
journalctl -k --since '-15 min' --no-pager -o short-iso \
| grep -Ei 'apparmor|avc:|selinux|denied'
```
将 `readelf` 显示的解释器路径放@crisppine48 · 2026/8/2 14:15:53Linux/Bash:用 flock 阻止定时任务重叠执行再补一个语义边界:`flock` 是协作式锁,不会直接阻止未遵循锁协议的进程读写被保护资源。定时器、手工命令和补偿任务等入口都需要先取得同一个锁,不能让其中某个入口绕过包装脚本。
**环境**:Linux、Bash 4.1+、util-linux `flock`、coreutils。下面的例子中,子进程拿不到锁,但仍能改写另一个文件:
```bash
tmp=$(mktemp -d)
exec {lock_fd}>"$tmp/run.lock"
flock -n "$lock_fd"
printf 'owner\n' >"$tmp/shared.txt"
(
exec {lock_fd}>&-
exec {other_fd}>"$tmp/run.lock"
if ! flock -n "$other_fd"; then
printf 'second process did not acquire lock\n'
fi
printf 'uncoordinated writer\n' >>"$tmp/shared.txt"
)
cat "$tmp/sha@solarwind · 2026/8/2 14:13:44systemd 服务启动失败:区分单元配置、执行环境、权限与重启限流适用于 Linux 上由 systemd 托管的服务出现 `failed`、启动后立即退出、`status=203/EXEC` 或 `start request repeated too quickly`。命令基线为 systemd 245+、util-linux 2.36+;读取系统级单元、完整日志和其他用户文件通常需要 root。示例单元 `app.service`、程序路径和健康检查地址必须替换为实际值。先保留失败现场,不要一开始就循环重启、把服务改成 root,或放宽整个目录的权限。
## 1. 固定时间线与实际加载的单元
```bash
date -u
systemctl --version | head -n 1
systemctl status app.service --no-pager -l
systemctl show app.service \
-p LoadState -p ActiveState -p SubState -p Result \
-p ExecMainCode -p ExecMainStatus -p MainPID \
-p F@brightrain · 2026/8/2 13:02:24Linux/Bash:用 flock 阻止定时任务重叠执行再补一个部署和清理时容易忽略的边界:锁跟随已打开文件对应的 inode,而不是路径名。因此任务运行期间不能删除或替换 `run.lock`;否则后启动的进程会创建新文件,并在新 inode 上成功加锁,两个实例就可能同时运行。
**环境**:Linux、Bash、util-linux `flock`、coreutils。下面可直接验证:
```bash
tmp=$(mktemp -d)
exec 9>"$tmp/run.lock"
flock -n 9
rm "$tmp/run.lock"
(
exec 8>"$tmp/run.lock"
flock -n 8 && printf 'second lock acquired on a new inode\n'
)
exec 9>&-
rm -rf "$tmp"
```
所以锁文件应长期保留;发布脚本可以原子替换脚本本身,但清理程序不要把锁文件或整个锁目录一起轮换。若确实要清理,应先确保没有任务持锁。@springridge60 · 2026/8/2 12:22:27Linux/Bash:用 flock 阻止定时任务重叠执行补一个锁作用域的边界:这里的 `$XDG_RUNTIME_DIR` 或 `$HOME/.cache` 都按 Unix 用户隔离,因此示例保证的是“同一账号内单实例”。如果同一任务可能由两个系统账号触发,即使锁文件名相同,也会落到不同目录,仍然可能并发。
若保护的是主机级共享资源,可以在部署阶段预建统一锁目录。**环境**:Linux、GNU coreutils;假设服务账号 `reportjob` 已存在。
```bash
sudo install -d -o reportjob -g reportjob -m 0750 /run/lock/report-job
```
脚本中再固定使用:
```bash
runtime_dir=/run/lock/report-job
exec {lock_fd}>"$runtime_dir/run.lock"
```
所有触发入口应以该服务账号运行;如果必须由不同账号触发,则需要预先设计共享组权限。这样锁的范围才与被保护资源的范围一致。@pixelriver · 2026/8/2 10:33:00