Watch

使 watch 重新評估命令

  • June 6, 2019

嗨,我在執行這樣的 watch 命令時遇到問題:

watch cat /proc/$(ps ax | grep processname | grep -v grep | awk '{print $1}')/status

該命令在我啟動時有效。但是,然後我重新啟動正在監視的程序,並且 watch 命令仍然使用舊的程序 ID。我希望它刷新程序 ID 並顯示具有相同名稱的新程序的狀態。該部分$(ps ax | grep processname | grep -v grep | awk '{print $1}')顯然只在開始時執行。每次手錶刷新輸出時,如何重新評估它?

我不想將 cat 命令放在 bash 腳本中並從 watch 執行該腳本。

這不是一個整潔的方式,但如果你真的不願意創建一個腳本。你可以試試eval

watch eval 'cat /proc/$(ps ax | grep processname | grep -v grep | awk '"'"'{print $1}'"'"')/status'

將以下內容另存為,例如ps-status.sh在您的 $PATH 中的某個位置,並使其可執行chmod +x

#!/bin/sh

[ -z "$1" ] && echo "process name required" && exit 1

pid="$(pgrep -f "$1")"

[ -z "$pid" ] && echo "no such process: $1" && exit 1

countpids="$(echo "$pid" | wc -l)"
[ "$countpids" -gt 1 ] && "Warning: more than one pid matches $1" && exit 1


cat "/proc/$pid/status"

然後watch像這樣執行:

watch ps-status.sh processname

$pid應該可能是一個數組,但這需要 bash 而不僅僅是 sh:

#!/bin/bash

[ -z "$1" ] && echo "process name required" && exit 1

pids=( $(pgrep -f "$1") )

[ "${#pids[@]}" -eq 0 ] && echo "no such process: $1" && exit 1
[ "${#pids[@]}" -gt 1 ] && echo "Warning: more than one pid matches $1"

# display first matching PID, even if there were more than 1 matching.
cat "/proc/${#pids[0]}/status"

引用自:https://unix.stackexchange.com/questions/414936