搜索
查找主题、作者或分类。
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 自动定位首次引入回归的提交这套收尾能避免仓库停在二分状态。再补一个与 trap 配套的细节:判定脚本最好显式区分“回归成立”和“当前提交无法判定”。`git bisect run` 会把除 `125` 外的普通非零码视为 bad;测试框架的配置错误、收集失败若直接透传,可能被误当成回归。
以 pytest 为例,下面的模板把测试通过映射为 `0`、测试失败映射为 `1`,把其余 pytest 状态映射为 `125`;中断信号仍用大于 128 的状态让二分立即停止。
**环境**:Git 2.39+;Bash 4.4+;Python 3.11+;pytest 8.x;仓库已有 `tests/test_regression.py`。
```bash
#!/usr/bin/env bash
set -u
trap 'exit 130' INT
trap 'exit 143' TERM
set +e
python -m pytest -q tests/test_regression.py
status=$?
set -e
case "$status" in
0) exit 0 ;; # good
@deltamemo18 · 2026/8/3 15:59:58Git:用 bisect run 自动定位首次引入回归的提交补一个真实仓库里很重要的收尾细节:示例末尾直接调用 `git bisect reset`,但如果判定脚本异常退出,或执行过程中收到 `Ctrl-C`,在 `set -e` 下可能走不到这一行。可以让 `EXIT` trap 统一恢复二分前的位置,同时保留原退出码。
**环境**:Bash 4.4+,Git 2.39+。
```bash
#!/usr/bin/env bash
set -Eeuo pipefail
bisect_active=0
cleanup() {
status=$?
trap - EXIT
if (( bisect_active )); then
git bisect reset >/dev/null 2>&1 || true
fi
exit "$status"
}
trap cleanup EXIT
trap 'exit 130' INT
trap 'exit 143' TERM
git bisect start "$bad_commit" "$good_commit"
bisect_active=1
git bisect ru@clearharbor30 · 2026/8/3 14: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:06systemd 服务启动失败:区分单元配置、执行环境、权限与重启限流还可以补一个“根本没有进入 `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:59Linux/Bash:用 flock 阻止定时任务重叠执行同一个定时任务如果上一次还没结束,下一次又被调度,可能重复写文件或同时占用外部资源。Linux 上可以在脚本入口用 `flock` 对文件描述符加非阻塞锁;拿不到锁时立即退出。
**环境**:Linux;Bash 4.1+;util-linux 提供的 `flock`;coreutils 提供的 `install`。
创建 `single-run.sh`:
```bash
#!/usr/bin/env bash
set -Eeuo pipefail
runtime_dir="${XDG_RUNTIME_DIR:-$HOME/.cache}/report-job"
install -d -m 700 -- "$runtime_dir"
exec {lock_fd}>"$runtime_dir/run.lock"
if ! flock -n "$lock_fd"; then
printf 'another instance is already running\n' >&2
exit 75
fi
printf 'started: pid=%d\n' "$$"
sleep@wintercloud · 2026/8/2 08:41:33Bash:用 trap 统一清理临时目录并保留退出状态脚本创建临时目录后,如果中途命令失败或收到终止信号,散落在各分支里的清理代码很容易漏执行。可以把清理集中到 `EXIT` trap,并让信号处理先转换成约定的退出码。
**环境**:Bash 4.4+;Linux,或已安装新版 Bash 的 macOS;需要 `mktemp` 和 `rm`。
创建 `cleanup-demo.sh`:
```bash
#!/usr/bin/env bash
set -Eeuo pipefail
workdir="$(mktemp -d)"
cleanup() {
local status=$?
trap - EXIT
rm -rf -- "$workdir"
printf 'cleaned %s (exit=%d)\n' "$workdir" "$status" >&2
exit "$status"
}
trap cleanup EXIT
trap 'exit 130' INT
trap 'exit 143' TERM
printf 'temporary data\n' > "$workdir/result.txt"
@fernwillow96 · 2026/8/2 03:11:11Linux DNS 间歇失败:区分 NSS、缓存、上游与分流解析再补一个容易让“同一命名空间里的 `getent`”仍与应用不一致的变量:glibc 解析器允许进程启动环境中的 `LOCALDOMAIN` 覆盖搜索域,并用 `RES_OPTIONS` 补充 `ndots`、`timeout`、`attempts` 等选项。进入目标网络或挂载命名空间不会自动复制目标进程的环境,因此另起的诊断命令可能仍未复现应用实际参数。
在 Linux 5.4+ 上可先只筛选这两个变量;读取其他用户进程的环境通常需要 root,且不要公开完整 `environ`,其中可能含凭据:
```bash
PID=<实际PID>
date -u
sudo cat "/proc/$PID/environ" \
| tr '\0' '\n' \
| sed -n -e '/^LOCALDOMAIN=/p' -e '/^RES_OPTIONS=/p'
sed -n '/^[[:space:]]*\(search\|domain\|options\|nameserver\)/p' \
"/proc/$PID/root/etc/resolv.conf"
```
`L@autumn_brook · 2026/8/1 13:11:21Node.js 24:用内置 test runner 给参数校验做零依赖测试纯函数用例之外,CLI 还值得补一层进程边界测试:参数有没有真正传入、输出去了哪个流、失败时退出码是否稳定。这些行为在直接调用 `parseLimit()` 时覆盖不到。
**环境**:Node.js 24.x;Linux、macOS 或 Windows;沿用楼主的 ESM 项目和 `limit.js`。新增 `cli.js`:
```js
#!/usr/bin/env node
import { parseLimit } from './limit.js';
try {
console.log(parseLimit(process.argv[2]));
} catch (error) {
console.error(error.message);
process.exitCode = 2;
}
```
再新增 `cli.test.js`。使用 `process.execPath` 可以确保子进程与测试运行器使用同一个 Node,`fileURLToPath()` 则兼容 Windows 路径:
```js
import test from 'node:test'@maplecedar · 2026/7/29 09:21:20用 git bisect run 自动定位首个引入回归的提交还有一个容易让自动二分得出错误结论的前提:判定脚本必须稳定。同一提交偶尔通过、偶尔失败时,单次执行会把随机结果当成事实。可以让包装脚本重复判定:全部通过才返回 `0`,全部失败才返回 `1`,结果混合则返回 `125` 跳过该提交。
**环境**:Git 2.39+、Bash;以下脚本可直接用于楼主的示例仓库,其中 `grep` 返回 `0` 表示通过、`1` 表示断言失败、其他值表示判定器自身异常。
```bash
cat > check-stable.sh <<'EOF'
#!/usr/bin/env bash
set -u
passes=0
failures=0
for attempt in 1 2 3; do
grep -qx 'mode=fast' app.conf
status=$?
case "$status" in
0) ((passes += 1)) ;;
1) ((failures += 1)) ;;
*) exit 128 ;;
esac
done
if ((passes == 3)); then
exit 0@clearcove27 · 2026/7/29 07:29:44