>

일부 프로그램은 STDIN 에서 종료됩니다  닫힙니다. 이 작업을 수행하는 사람들은 "포트"를 통한 Erlang/Elixir 감독과 잘 작동합니다.

없는 경우 엘릭서 문서이 래퍼 스크립트를 제안하십시오 :

#!/bin/bash
# wrapper.sh
"$@" &
pid=$!
while read line ; do
  :
done
kill -KILL $pid

wrapper.sh my_script arg1 arg2 를 호출 할 수 있습니다. . wrapper.sh  지정된 프로그램을 시작하고 배경으로, wrapper.sh STDIN  폐쇄, 차단 read  완료되고 백그라운드 프로세스가 종료됩니다.

그러나이 방법에는 단점이 있습니다.다른 이유로 백그라운드 프로세스가 종료되면 wrapper.sh  알 수 없으므로 Erlang/Elixir도 마찬가지입니다.

다음을 수행하도록이 스크립트를 수정하고 싶습니다 :

루프에서 :

  • STDIN 인 경우  폐쇄, $pid 를 죽여
  • $pid 인 경우  죽었습니다. 종료
  • 그렇지 않으면 잠들지 마세요

아무것도 방법을 제안 할 수 있습니까?

  • 답변 # 1

    $pid 인지 확인할 수 있습니다  이렇게 죽었다 :

    while kill -0 $pid >/dev/null; do
        # $pid is still alive
    done
    # $pid is dead or you lack permissions to send signals to it
    
    

  • 답변 # 2

    쉘이 dash 인 경우 / busybox ksh93  또는 zsh , 당신은 SIGCHLD 에 함정을 설정할 수 있습니다 :

    #! /bin/sh
    trap exit CHLD
    "$@" &
    while read line; do :; done
    kill $!
    wait
    
    

    "$@" & 가 끝나 자마자 종료됩니다  프로세스가 종료되었거나 read   EOF 를 얻었다 .

    그러나 pyzwyz  불쾌한 bash 가  내장 신호는 신호에 의해 중단 될 때 제자리에 다시 시작되므로 더 복잡한 작업이 필요합니다. 종료시 백그라운드 프로세스가 부모에게 종료 신호를 보내도록 준비 할 수 있습니다.

    read
    
    
    이것은 #! /bin/sh { "$@"; kill $$; } & while read line; do :; done pkill -P $! kill $! wait 를 기다리기 위해 다른 프로세스를 낭비해야 할 것이다.  명령 및 "$@" 사용   -P 의 (부모 pid) 선택기   pkill 이후  더 이상 $! 를 참조하지 않습니다  그러나 부모에게 명령하십시오. 여분의 "$@"   kill $! 의 경우 여전히 필요합니다  내장되어 있습니다. 스크립트에는 작업 제어가 없습니다. 모든 프로세스 ( "$@" 로 시작한 프로세스 포함) )를 동일한 프로세스 그룹에서 실행하십시오.

    & 를 사용할 수 있습니다  어디서나 p/kill -KILL  신호가 충분하지 않습니다.

    최신 버전 (>= 4.0) 버전의 bash에서만 작동하는 또 다른 복잡한 해결 방법은 비표준 TERM 를 사용하는 것입니다.   -t 의 (시간 초과) 옵션  그리고 read 사실을 이용   read 에 1을 반환합니다  시간 초과시 상태>128

    EOF
    
    

    이것은 어떻게 든 #! /bin/bash "$@" & while :; do read -t 1 line case $? in 0) ;; 1) kill $!; wait; exit;; *) kill -0 $! || exit;; esac done 2>/dev/null 와 함께 작동하는 것 같습니다 이기도합니다.

    mksh

  • 이전 filesystems - 폴더가있는 실제 장치는 어떻게 찾습니까?
  • 다음 make - 커널 모듈 개발을 위해 Buildroot로 스테이징하기 위해 커널 개발 헤더를 설치하는 방법은 무엇입니까?