Watch
使 watch 重新評估命令
嗨,我在執行這樣的 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"