안녕하세요, 다음과 같이 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'