2013-11-15 3 views
0
(cmdpid=$BASHPID; (sleep 3; kill $cmdpid) & exec ./myscript) 

null로 메시지를 죽일 리디렉션하지만 리디렉션되지하지만 성공하기 위해 나는 노력 메시지 bash는 명령 제한 시간은이가 작동

line 80: 30631 Terminated    
(cmdpid=$BASHPID; (sleep 3; kill $cmdpid 2> /dev/null 0<&1 2>&1) & exec ..... 

를 죽이 표시되지 않도록 방법을 모르겠어요. 어떤 생각? 감사합니다

답변

0

메시지가 분명히 쉘의 작업 제어 기능에서 오는 것입니다.

set +m 
(cmdpid=$BASHPID; (sleep 3; kill $cmdpid) & exec ./myscript) 

메시지는 kill에서 오는 것이 아니라, 오히려 배경 서브 쉘은 kill를 어떤을 실행하십시오 부모 쉘을 사용하지 않도록 설정하면 작동하는 것 같다.

(cmdpid=$BASHPID; (sleep 3; kill $cmdpid) 2> /dev/null & exec ./myscript) 

다른 시도를보십시오 :

(set +m; cmdpid=$BASHPID; (sleep 3; kill $cmdpid) & sleep 5) 
(cmdpid=$BASHPID; (sleep 3; kill $cmdpid); disown %% & sleep 5) 
(cmdpid=$BASHPID; (sleep 3; kill $cmdpid); disown %1 & sleep 5) 

(나는 독립의 간부에 대한로 sleep 5을 사용하는 유일한 명백한 차이가 난 그냥 단어가 통지로 "종료"를 참조하십시오 것입니다..)

+0

아니요, 작동하지 않습니다. "Terminated ...." – user2274696

+0

흠, 나는 BASHPID를 설정하지 않은 'bash' 3에서 테스트 중이므로'kill '이 실행되지 않았습니다. 'bash'4에서 테스트 한 결과, 쉘이 터미널에 직접 라인을 쓰는 것 같습니다. 백그라운드 프로세스에서'disown '을 사용하고'set + m'을 사용하여 작업 제어를 사용하지 않으려 고 시도했지만 성공하지 못했습니다. – chepner

+0

좀 더 디버그를했습니다 ... "종료 된"메시지는 $ BASHPID pid를 참조하며 kill -HUP을 사용하면 메시지가 "Hangup ...."으로 변경되므로 kill에 의해 처리됩니다. 그러나 억압 할 수있는 방법은 없습니다. – user2274696

0

간단한 해결책 (플랫폼에 따라 다름)은 timeout 명령을 사용하는 것일 수 있습니다.

$ /usr/bin/timeout 30 /path/to/exec 

이 30 초 후에 처리 /path/to/exec을 중지합니다.

timeout 2>/dev/null 1 sleep 2을 사용하면 '킬 (Killed)'응답이 표시됩니다. 아마도 당신이 당신의 방법을 사용하는 곳과 같을 것입니다 ...

0

나는 다른 방식으로 나 자신을 해결했고, 나는 나누고 싶습니다 ... 아마도 누군가는 앞으로 필요할 것입니다. 이렇게하면 ./script가 timeout과 함께 실행되고 오류를 포함하여 출력됩니다.

내가 해결할 수없는 사소한 단점은 에코로 결과를 $ OUT에 추가하는 것보다 다른 어떤 방법으로 어떤 이벤트가 발생하면 주 $ 셸에 신호를 보내는 것입니다. 나는 이것이 bash 프로그래밍 (대부분 다른 것들 중에서)에서 가장 바보 같은 부분이라고 생각한다. 각각의() 구조는 자신의 pid이고 변수를 격리한다. 여하튼, 즐기십시오. 당신이로 달성 될 수있다 사용할 수있는 명령 제한 시간으로 리눅스에있는 경우

OUT=$((./script) & pid=$! 
    # will exit 128 + (signal number) 

    (sleep $RUN_TIMEOUT && kill -HUP $pid) 2>/dev/null & watcher=$! 

    if wait $pid; status=$?; then 
     if [[ $status -eq 129 ]]; then # 129 -> OK (hangup, means timeout) 
      echo "execution_timeout" 
     else 
      # other, including 255 -> return error 
      echo "execution_error" 

     fi 
    fi # 0 -> normal return, success 

    pkill -HUP -P $watcher  
    wait $watcher  

) 2>&1 # + stderr 
0

은 다음과 같습니다 매뉴얼 페이지로

timeout --foreground <time in seconds> <command> 

:

 --foreground 

      when not running timeout directly from a shell prompt, 

      allow COMMAND to read from the TTY and get TTY signals; in this mode, children of COMMAND will not be timed out 

는 또한 억제 " 종료 된 "/"Killed "메시지가 표시됩니다.