bash 스크립트가 백그라운드에서 실행 중인지 어떻게 감지 할 수 있습니까?


28

bash 스크립트가 포 그라운드 또는 백그라운드에서 실행 중인지 알 수있는 방법이 있습니까? 따라서 각 경우에 약간 다르게 작동 할 수 있습니까?


작업 제어로 인해 프로세스가 포 그라운드에서 백그라운드로 또는 그 반대로 이동할 수 있습니다.
Barmar

답변:


30

인용 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

분명히 $ (...) 내에서 호출 된 것은 자체적으로 백그라운드에서 실행됩니다 ....? 나는 생각 프로세스 그룹이 작동하는지 부정 할 수 없다, 그러나 중요한 일이다.
Ed Randall

2

/etc/bash.bashrc "파일을보십시오.

"$ PS1"이있는 줄 그런 다음 "man bash"를 수행하고 토큰 PS1을 찾으십시오.

[ -z "$PS1" ] && return

대화식이 아닌 스크립트를 종료합니다.


1

이전의 모든 솔루션에는 프로세스 생성 등이 포함 .bashrc됩니다. bash 쉘이 실행될 때마다 호출되므로 1000 개가 넘는 프로세스가 종료됩니다.

훨씬 더 깔끔한 것은 bash 자체를 요청하는 것입니다. bash에는 $-대화식 쉘에서 실행되는 경우 "i" 가있는 미리 정의 된 변수 가 있습니다. 예를 들어, 이것을 .bashrc에 넣으면 훨씬 깨끗하고 저렴하며 가장 중요한 것은 항상 작동합니다!

case "$-" in 

    *i*) # interactive shell

    ;;
esac

왜 고함을 지르고 있습니까? 모습 이 매우, 매우 추한 ...
Pierre.Vriens

간단하고 정확한 솔루션.
Ed Randall

0

쉘이 대화식 모드로 실행되는지 확인하면 실제로 동일한 결과를 얻을 수 있다고 생각할 수는 있지만 실제로는 그렇지 않습니다. 개념은 비슷해 보이지만 실제로는 다릅니다. 예상 덕분에 백그라운드 피드 입력 에서 대화식 스크립트를 실행할 수 있습니다 . 또한 -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 요소 각각에 해당 해주십시오 pgrptpgid( 투시 은 / proc / [PID] / STAT man 페이지의 섹션 - man 5 proc).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.