bash 스크립트가 포 그라운드 또는 백그라운드에서 실행 중인지 알 수있는 방법이 있습니까? 따라서 각 경우에 약간 다르게 작동 할 수 있습니까?
bash 스크립트가 포 그라운드 또는 백그라운드에서 실행 중인지 알 수있는 방법이 있습니까? 따라서 각 경우에 약간 다르게 작동 할 수 있습니까?
답변:
인용 man ps
:
Here are the different values that the s, stat and state output
specifiers (header "STAT" or "S") will display to describe the state of
a process.
...
+ is in the foreground process group
따라서 간단한 검사를 수행 할 수 있습니다.
case $(ps -o stat= -p $$) in
*+*) echo "Running in foreground" ;;
*) echo "Running in background" ;;
esac
이전의 모든 솔루션에는 프로세스 생성 등이 포함 .bashrc
됩니다. bash 쉘이 실행될 때마다 호출되므로 1000 개가 넘는 프로세스가 종료됩니다.
훨씬 더 깔끔한 것은 bash 자체를 요청하는 것입니다. bash에는 $-
대화식 쉘에서 실행되는 경우 "i" 가있는 미리 정의 된 변수 가 있습니다. 예를 들어, 이것을 .bashrc에 넣으면 훨씬 깨끗하고 저렴하며 가장 중요한 것은 항상 작동합니다!
case "$-" in
*i*) # interactive shell
;;
esac
쉘이 대화식 모드로 실행되는지 확인하면 실제로 동일한 결과를 얻을 수 있다고 생각할 수는 있지만 실제로는 그렇지 않습니다. 개념은 비슷해 보이지만 실제로는 다릅니다. 예상 덕분에 백그라운드 피드 입력 에서 대화식 스크립트를 실행할 수 있습니다 . 또한 -l
인수 와 함께 bash로 스크립트를 시작할 수 있습니다 . 따라서 스크립트가 백그라운드 또는 포 그라운드에서 실행되는지 확인하기 위해 bash 상호 작용에 의존 할 수 없습니다.
따라서 devnull의 대답은 정확합니다 . 프로세스가 포 그라운드에서 실행 중인지 확인하기 위해 ps 유틸리티 는 프로세스 그룹 (pgrp)이 세션의 제어 터미널 (tpgid) 과 연관된 프로세스 그룹 ID와 동일한 지 확인하고 프로세스+
에 따라 출력에 부호를 추가합니다. 상태.
이를 알면 테스트의 순수한 bash 버전을 가질 수 있습니다.
#!/usr/bin/env bash
IFS=$' '
retval=($(</proc/$$/stat))
IFS=$' \t\n'
if [[ "${retval[3]}" == "${retval[7]}" ]]; then
echo "Background" > ./result.txt
else
echo "Foreground" > ./result.txt
fi
exit
위의 코드 stdout
에서 백그라운드에서 프로세스가 실행될 때 연결되지 않았기 때문에 결과를 텍스트 파일로 출력합니다 .
제 4 회를 기록하고 테이블의 8 요소 각각에 해당 해주십시오 pgrp
과 tpgid
( 투시 은 / proc / [PID] / STAT man 페이지의 섹션 - man 5 proc
).