Linux bash는 백그라운드 프로세스 집계를 방지합니다.

Linux bash는 백그라운드 프로세스 집계를 방지합니다.

내 스크립트는 무리를 만듭니다. 이렇게 하면 두 번 실행하는 것을 방지할 수 있습니다. 스크립트가 다른 스크립트를 실행할 수 있으므로 문제가 발생합니다. 때로는 다른 스크립트가 프로세스를 백그라운드에 남겨두는 경우도 있습니다. 불행하게도 그들은 나에게 필요하지 않은 무리를 물려받았습니다. 지정된 실행 파일을 실행하기 전에 일부 파일 핸들을 닫는 래퍼가 있습니까?

저는 Linux 데비안을 사용하지만 중요한 Linux 배포판이나 버전은 아닙니다.

자세한 시나리오:

  1. 내 스크립트 A가 실행되었습니다.
  2. 내 스크립트 A는 사람들을 나에게 몰려들게 만든다.
  3. 내 스크립트 A는 외부 실행 파일 B를 실행합니다.
  4. 외부 B는 실행 파일 C를 백그라운드로 실행합니다(무리 상속).
  5. 외부 B는 완료되고 C는 백그라운드에 남습니다(무리를 상속함).
  6. B가 완료되었기 때문에 내 스크립트 A가 완료됩니다.
  7. 또 다른 루프, 내 스크립트 A가 실행됩니다(포인트 1에서와 같이).
  8. C가 여전히 실행 중이기 때문에 내 스크립트 A로 인해 클러스터가 실패합니다.

닫힌 집계 파일 핸들을 사용하여 외부 실행 파일 B를 정확하게 실행하고 싶습니다. Flock은 내 스크립트 A만 실행될 때까지 유지되어야 합니다. 나는 "무리 구멍"이 있을 것이기 때문에 2시에서 3시 사이에 빡빡한 무리를 원하지 않습니다. 이와 유사한 패키지 운영 체제가 있습니까?

답변1

~에 따르면무리 매뉴얼 페이지, 이는 -u 또는 --unlock 옵션을 사용합니다.

-u, --잠금 해제

자물쇠를 내려놓으세요. 파일을 닫으면 잠금이 자동으로 제거되므로 일반적으로 이 작업은 필요하지 않습니다. 그러나 특별한 경우에는 필요할 수 있습니다. 예를 들어 닫힌 명령 그룹이 잠금을 유지해서는 안 되는 백그라운드 프로세스를 분기했을 수 있습니다.

따라서 규정된 기술은 다음과 같습니다.

(
    flock 200 | exit 99
    # some commands that should be guarded by the lock
    # some of them fork daemons that keep our lock file open
    flock --unlock 200 # we're done with the lock, we can release it
) 200>/path/to/lock-file

답변2

다음 코드는 잠금을 획득하고 trap스크립트가 종료될 때 잠금이 해제되도록 합니다. 하위 프로세스는 잠금을 상속하지만 flock --unlock 200실행 후에는 이를 유지하지 않습니다.

flock 200 | exit 1
trap "flock --unlock 200" EXIT
# The rest of the script...

참고: trap한 번에 1개만 유효합니다. 종료 트랩에서 여러 명령을 실행해야 하는 경우 해당 명령을 메서드에 넣거나 결합해야 합니다 trap "flock --unlock 200; echo Bye" EXIT.

답변3

어제 포장에 관해 글을 썼습니다. 불필요한 핸들을 모두 닫은 다음 지정된 명령을 호출합니다. 불행하게도 핸들 유형을 확인하지 않고 일부 알려진 핸들을 제외한 모든 핸들을 닫습니다.

<==== file: wrapper.sh ====>
#!/bin/bash
for fd in $(ls /proc/$$/fd); do
 case "$fd" in
  0|1|2|255)
 ;;
 *)
  eval "exec $fd>&-"
 ;;
 esac
done
exec $1 $2 $3 $4 $5 $6 $7 $8 $9

다음과 같이 계산합니다.

wrapper.sh some_command command parameters

이 디포머를 사용할 수 있어요3단계내 통화 시나리오에서. 그런 다음 무리는 기본 스크립트에만 존재하고 래퍼는 호출된 스크립트와 해당 하위 스크립트에서 상속을 중단합니다.

관련 정보