시계가 명령을 재평가하게 하세요

시계가 명령을 재평가하게 하세요

안녕하세요, 다음과 같이 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에서 스크립트를 실행하고 싶지 않습니다.

답변1

이는 깔끔한 접근 방식은 아니지만 실제로 스크립트를 생성할 의사가 없는 경우입니다. 당신은 시도 할 수 있습니다 eval.

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

답변2

다음을 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아마도 배열이어야 하지만 sh뿐만 아니라 bash도 필요합니다.

#!/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"

답변3

스크립트 파일

#!/bin/bash
ps -eaf | grep -i processname| grep -v grep |awk '{print $2}'
/etc/init.d/servicename restart

설명하다

crontab이 1분마다 실행되도록 예약

그런 다음 다음 watch 명령을 사용하여 프로세스 이름이 다시 시작된 후 프로세스 ID의 차이를 확인하십시오.

watch -n 60 script.sh  

답변4

작은따옴표를 사용하여 $(...)해당 항목을 실행하는 대화형 셸에 의해 확장되는 것을 방지할 수 있습니다. 그런 다음 일시적으로 큰따옴표로 전환했다가 다시 되돌려 작은따옴표를 이스케이프 처리해야 합니다. 따라서 다음이 작동합니다.

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

그러나 여기에서 일반적으로 수행되는 작업을 이해하려면 플래그가 아닌 모든 인수가 먼저 명령 문자열로 연결된다는 watch점을 기억해야 합니다 . watch이는 "도움이 되기 위해" 수행하지만 실제로는 무슨 일이 일어나고 있는지 모호하게 하기 때문에 비생산적이라고 생각합니다. 항상 명령 문자열을 제공하면 더 깨끗하고 이해하기 쉬울 것이라고 생각합니다(이 경우 대화형 셸이 그 안에 있는 내용을 확장하지 못하도록 작은따옴표로 묶음).

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

관련 정보