클러스터 실행 파일을 사용하는 일부 스크립트가 있습니다. 좋은 결과. 문제는 이 스크립트가 다른 스크립트를 호출할 때 백그라운드 프로세스를 생성한다는 것입니다. 이 경우 백그라운드 프로세스는 시스템 동작인 파일 잠금에 대한 파일 핸들을 상속합니다. 나는 래퍼로 사용할 수 있고 특히 파일 잠금의 경우 원치 않는 핸들을 모두 닫을 수 있는 도구를 찾고 있습니다.
제 생각에는 메인 프로세스만 두 번 실행되지 않도록 보호해야 합니다. 나는 이것이 일반적인 상황이 아니라는 것을 알고 있습니다. 일반적으로 모든 하위 항목은 파일을 잠긴 상태로 유지해야 하지만 이 경우에는 작동하지 않습니다.
지금은 위의 기본 코드와 함께 일부 래퍼를 사용하여 몇 가지 해결 방법을 사용하고 있지만 일부 바이너리 래퍼를 사용하는 것을 선호합니다.
암호:
#!/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
답변1
귀하의 스크립트는 충분히 좋아 보입니다. 몇 가지 개선이 필요합니다.
#!/bin/bash
shopt -s nullglob
for fd in "/proc/$$/fd/"*; do
fd=${fd##*/}
case "$fd" in
0|1|2|255)
;;
*)
eval "exec $fd>&-"
;;
esac
done
exec "$@"
nullglob
이렇게 하면 파일을 찾을 수 없는 경우 패턴 자체가 렌더링되지 않습니다.- 매개변수 대체 방법을 사용한
${v##pat}
와일드카드 또는 파일 이름 확장이면 충분합니다.ls
사용할 필요가 없습니다. "$@"
스크립트에 전달된 모든 매개변수를 나타내는 데 사용할 수 있습니다 .
스크립트는 외부 종속성 없이 실행되도록 보장되므로 바이너리를 실행하는 것만큼 좋습니다.
답변2
호출자와 격리된 백그라운드 작업을 실행하려고 합니다. 정말 그럴 것 같아악마.
불행하게도 프로그램을 데몬으로 시작하는 표준 유틸리티는 없습니다. 데비안과 그 파생물은 다음을 제공합니다.start-stop-daemon
, 그러나 불행하게도 이것은 다른 배포판으로 이식 가능하지 않습니다. 당신은 설치할 수 있습니다daemonize
, 대부분의 UNIX 변형에서 실행됩니다.