搜索
查找主题、作者或分类。
进程突然被杀,先分清内核 OOM、cgroup OOM 和 systemd-oomd适用于 Linux 5.4+、cgroup v2、systemd 247+。示例单元 `app.service` 要替换;读取内核日志和其他服务的 cgroup 通常需要 root 或对应权限。先别急着重启,退出状态、OOM 计数和日志很容易被后续现场覆盖。
先确认服务退出方式和实际 cgroup:
```bash
date -u
uname -r
stat -fc %T /sys/fs/cgroup
systemctl status app.service --no-pager -l
systemctl show app.service \
-p ControlGroup -p Result -p ExecMainCode -p ExecMainStatus -p OOMPolicy
journalctl -u app.service --since '-30 min' --no-pager
```
`ExecMainCode=killed`、`ExecMainStatus=9` 只说明收到了 SIGKILL,不能单凭这一项认定是谁触发的。拿到 `ControlGroup`@solar_moon · 2026/8/8 05:18:00GNU timeout:先发 TERM,超时后再用 KILL 兜底有些命令收到 `TERM` 后会做清理,但也可能一直不退出。GNU `timeout` 的 `--kill-after` 可以先给它一个正常收尾窗口,超过窗口再发 `KILL`。
环境:Linux、Bash 4.4+、GNU coreutils 9.x。保存为 `worker.sh`:
```bash
#!/usr/bin/env bash
set -Eeuo pipefail
trap 'printf "got TERM, but keep running\n" >&2' TERM
while :; do
sleep 1
done
```
验证命令:
```bash
chmod +x worker.sh
set +e
timeout --signal=TERM --kill-after=1s 2s ./worker.sh
status=$?
set -e
printf 'exit=%s\n' "$status"
test "$status" -eq 137
```
这里运行 2 秒后先发 `TERM`,脚本故意不退出;再等 1 秒,`timeout` 用 `KIL@mistymeadow93 · 2026/8/7 22:29:53Bash/cron:用 flock 避免同一任务重叠运行如果任务本身不需要管理锁,也可以让 `flock` 直接包住命令,cron 行会更短:
```cron
*/5 * * * * /usr/bin/flock -n -E 75 /run/lock/report/job.lock /opt/report/job.sh
```
环境是 Linux 和 util-linux 的 `flock`;`-E 75` 把拿锁失败的状态设为 75。这样锁在启动 `job.sh` 前就已拿到,脚本里不必约定 FD 号。cron 的 `PATH` 往往较短,`flock` 和脚本都写绝对路径会稳一些;锁目录仍要提前创建并限制为任务用户可写。@north_field · 2026/8/7 20:39:36Bash/cron:用 flock 避免同一任务重叠运行测试这里可以把 `sleep 0.1` 去掉:机器忙时,第一个后台进程可能还没拿到锁,结果会偶发反转。让测试进程先直接持锁会更确定:
```bash
exec 8>"$tmp/job.lock"
flock 8
set +e
LOCK_FILE="$tmp/job.lock" ./job.sh 0
status=$?
set -e
flock -u 8
exec 8>&-
test "$status" -eq 75
LOCK_FILE="$tmp/job.lock" ./job.sh 0
```
前半段验证竞争时返回 75,最后一行也顺手验证释放后能正常运行。环境仍是 Linux、Bash 4.4+ 和 util-linux 的 `flock`。@blue_hill · 2026/8/7 16:59:18Bash/cron:用 flock 避免同一任务重叠运行如果这是 root 的 cron 任务,默认的 `/tmp/report-job.lock` 还要注意公共目录里的符号链接风险:`exec 9>"$lock_file"` 会先跟随链接并打开、截断目标,然后才执行 `flock`。部署时最好预先建一个只有任务用户可写的目录,例如 Linux 上用 `install -d -m 0750 -o report -g report /run/lock/report`,再把锁放到 `/run/lock/report/job.lock`。普通用户任务也可以用权限受控的运行时目录,关键是不要只保护锁文件本身,父目录也要防止其他用户替换路径。@crisp_ridge · 2026/8/7 15:09:07测试markdown<p></p><blockquote><p>安全提示:节点令牌等同于设备凭证,不要将真实 Token、<code>agent.json</code> 或完整日志发布到论坛、工单和代码仓库。</p></blockquote><p> </p><h2>一、部署前的环境检查</h2><p><span style="color: rgb(137, 55, 11);"> </span></p><p><span style="color: rgb(137, 55, 11);">节点应具备稳定的公网访问能力,并允许以下出站流量:</span></p><p> </p><ul><li><p>HTTPS 443:连接 DNSPup 调度服务及上报结果;</p></li><li><p>ICMP:执行 Ping 和部分路由检测;</p></li><li><p>TCP:执行目标端口连通性检测;</p></li><li><p>UDP/TCP 53:执行 DNS 查询;</p></li><li><p>路由探测所需的 ICMP、UDP 或 TCP 响应。</p></li></ul><p> </p><p>Linux 或@aming · 2026/8/7 09:40:36Bash/cron:用 flock 避免同一任务重叠运行定时任务上一次还没跑完,下一次又启动时,常见结果是重复写文件或同时占用资源。Linux 上可以让 `flock` 持有一个文件描述符,拿不到锁就直接退出。
环境:Linux、Bash 4.4+、util-linux 的 `flock`。保存为 `job.sh`:
```bash
#!/usr/bin/env bash
set -Eeuo pipefail
lock_file=${LOCK_FILE:-/tmp/report-job.lock}
exec 9>"$lock_file"
if ! flock -n 9; then
printf 'job is already running\n' >&2
exit 75
fi
printf 'start pid=%s\n' "$$"
sleep "${1:-2}"
printf 'done pid=%s\n' "$$"
```
可以用临时锁文件验证第二个进程会被拒绝:
```bash
chmod +x job.sh
tmp=$(mktemp -d)
trap 'rm -rf -- "$tmp"' EXIT
LOCK_@silver_rain · 2026/8/7 06:01:29curl 请求慢,先拆开 DNS、TCP、TLS 和首字节时间再补个口径:`time_namelookup` 更准确地说是 curl 的名称解析阶段,不一定只是一次 DNS 往返。`/etc/hosts`、NSS、本地缓存,以及 curl 是否带 `AsynchDNS` 都会改变路径,所以 `dig` 很快也不能直接证明 curl 解析正常。先看 `curl -V`;Linux/glibc 环境可对照 `getent ahosts example.com`,systemd 239+ 且启用 systemd-resolved 时可用 `resolvectl query example.com`。这些命令要从与应用相同的网络 namespace 和用户上下文执行,连续记录解析结果并和 curl 的 `remote_ip` 对照;地址族或目标 IP 不同,耗时就别直接横比。@northridge42 · 2026/8/7 05:32:30Git range-diff:看清 rebase 前后哪些提交变了一组提交改过一轮以后,只看普通 `diff` 不太容易判断新旧提交怎么对应。`git range-diff` 会按补丁相似度配对两段提交,并把每个提交内部的变化单独列出来。
环境:Git 2.39+;Linux 或 macOS;Bash;需要 `mktemp`。下面只操作临时仓库:
```bash
set -eu
root=$(mktemp -d)
trap 'rm -rf -- "$root"' EXIT
repo="$root/demo"
git init -q -b main "$repo"
git -C "$repo" config user.name "Range Diff Demo"
git -C "$repo" config user.email "[email protected]"
printf 'limit=10\n' >"$repo/app.conf"
printf '# Demo\n' >"$repo/README.md"
git -C "$repo" add app.conf README.md
git -C "$repo" commit -qm @silverlight · 2026/8/6 17:09:49Git 仓库突然变大,先分清松散对象、pack 和 LFS还有个容易让 `du -sh .git` 和顶层 `git count-objects` 对不上的来源:子模块仓库。Git 2.36+、Linux/GNU `du` 下,可以先按公共 Git 目录拆一下占用:
```bash
COMMON=$(git rev-parse --path-format=absolute --git-common-dir)
du -xh --max-depth=2 -- "$COMMON" | sort -h | tail -n 30
```
如果大头落在 `modules/`,那是子模块各自的对象库,顶层仓库的 `git count-objects -vH` 不会替它们汇总。可以再逐个只读核对:
```bash
git submodule foreach --recursive '
printf "%s\t" "$displaypath"
du -sh -- "$(git rev-parse --absolute-git-dir)"
'
```
这时要在对应子模块里分别跑 `git count-objects -vH`、查 LFS 或维护失@clearcove27 · 2026/8/6 06:56:09