liveness_probe.sh 1.74 KB
#!/data/data/com.termux/files/usr/bin/bash
# 进程判活探针(只读)——process-liveness-probe skill §二 的可执行版
#
# 用法:  bash liveness_probe.sh <pattern> [pid]
#   pattern : ps 的 grep pattern(建议用真身关键字,如 'hermes gateway' / 'watchdog')
#   pid     : 可选;给了就直读 /proc/<pid>/cmdline 出正身(最硬的一条证据)
#
# 判读纪律(写汇报前必读):
#   - [2] 段 0 命中 ≠ 进程不在(-o cmd 只给 comm/解释器名:python 脚本进程只显 `python3`)
#   - 阳性只在 [1] / [3] 段取得;两者都阴才写「未复核存在性」,不写「进程没了」
#   - 跨轮比 pid 前先在本轮复核 pid,再写「未重启 / 已重启」

PAT="${1:?usage: liveness_probe.sh <pattern> [pid]}"
PID="${2:-}"

echo "== [1] su 侧完整 argv(ps -ef,首选读法) pattern='$PAT'"
su -c "ps -ef" 2>/dev/null | grep -Ei "$PAT" | grep -v grep

echo "== [2] su 侧 -o cmd(⚠️ 只见 comm/解释器名;0 命中不算证据)"
su -c "ps -A -o user,pid,ppid,etime,cmd" 2>/dev/null | grep -Ei "$PAT" | grep -v grep

echo "== [2b] 自己 uid 的全部进程(按 comm 口径,用于对照)"
su -c "ps -A -o user,pid,ppid,etime,cmd" 2>/dev/null | awk 'NR==1 || $1 ~ /^u0_a/'

echo "== [3] /proc 直读正身(pid=${PID:-<未给,跳过>})"
if [ -n "$PID" ]; then
  if ls -l "/proc/$PID/cmdline" >/dev/null 2>&1; then
    echo "   cmdline 可读 ⇒ 活着;argv ="
    su -c "tr '\0' ' ' < /proc/$PID/cmdline" 2>/dev/null; echo
    su -c "ps -o etime= -p $PID" 2>/dev/null
  else
    echo "   /proc/$PID 不存在 ⇒ 这条才是真死(先确认 pid 没变)"
  fi
fi

echo "== [4] 提醒:0 命中不算证据;python 起的进程在 [2] 只显 'python3',正身看 [1]/[3]"