1000부터 카운트다운하는 기본 쉘 스크립트를 만들었습니다. 이는 단지 테스트용이지만 모든 애플리케이션/프로세스가 될 수 있습니다.
##filename:test.sh##
#!/bin/bash
i=1000; while [ $i -gt 0 ]; do echo $i; i=`expr $i - 1`; sleep 1; done
나는 달리기 시작합니다 :
sh test.sh
이제 다음을 얻어야 합니다: a) 스크립트의 pid, b) 스크립트의 상태
만약 내가한다면
pidof sh test.sh
그러나 여러 결과를 얻습니다.
달리기
ps aux | grep test.sh
일부 종료됨(상태=T) 및 하나의 항목을 포함하여 여러 항목을 받았습니다 . 필요한 항목으로 grep test.sh
제한하려면 어떻게 해야 합니까 (단지 하나의 인스턴스만 실행 중이라고 가정).pidof
나에게도 나라가 필요하다. 나는 실행하려고 :
ps aux | grep test.sh | ps -o stat --no-headers
그러나 그것은 작동하지 않았습니다. 상태를 얻었지만 여러 프로젝트에 대해
답변1
pidof -x test.sh
그러면 PID를 얻는 데 필요한 정보가 제공됩니다.
매뉴얼 페이지에서,
-x 스크립트 - 프로그램이 지정된 스크립트를 실행하는 셸의 프로세스 ID도 반환하게 합니다.
이건 내 시험이야,
tony@trinity:~$ ls -l testit.sh
-rwxr-xr-x 1 tony tony 83 Jan 5 14:53 testit.sh
tony@trinity:~$ ./testit.sh
1000
999
998
997
동시에
tony@trinity:~$ ps -ef | grep testit.sh
tony 4233 20244 0 14:58 pts/5 00:00:00 /bin/bash ./testit.sh
tony 4295 3215 0 14:58 pts/6 00:00:00 grep --color=auto testit.sh
그런 다음
tony@trinity:~$ pidof -x testit.sh
4233
이후 쿼리는 일반적인 문제이며 한 가지 해결책은 다음과 같습니다.
ps aux | grep test.sh | grep -v grep
이렇게 하면 행이 하나만 제공됩니다( test.sh
고유하다고 가정).
마지막으로, 최종 명령에서는 PID만 전달하는 것이 아니라 전체 텍스트 줄을 전달합니다. 이는 ps
PID를 얻는 방법도 아닙니다(PID는 뒤에 올 것으로 예상됩니다 -p
).
예를 들어,
tony@trinity:~$ ps aux | grep testit.sh
tony 4233 0.1 0.0 4288 1276 pts/5 S+ 14:58 0:00 /bin/bash ./testit.sh
tony 5728 0.0 0.0 3476 760 pts/6 S+ 15:04 0:00 grep --color=auto testit.sh
따라서 grep을 실행한 다음 pid를 반환해야 합니다.
tony@trinity:~$ ps aux | grep testit.sh | grep -v grep | awk '{print $2}'
4233
그 다음에,
tony@trinity:~$ ps -o stat --no-headers -p $(ps aux | grep testit.sh | grep -v grep | awk '{print $2}')
S+
이를 달성하기 위한 덜 복잡한 방법이 많이 있을 수 있지만 저는 진행 상황을 보여주고 싶었습니다.