문제

할 수 있는 방법을 억제하는 Terminated 메시지가 나오는 후에 당신을 죽일 프로세스에서 bash 스크립트를 사용해야 할까요?

set +bm, 지만,그것은 작동하지 않는다.

내가 알고 있는 또 다른 솔루션을 포함한 전화 exec 2> /dev/null, 하지만 그 신뢰할 수 있습니까?나는 어떻게 재설정할 수 있도록 계속 볼 stderr?

도움이 되었습니까?

해결책

이 부분은,당신은 할 수 없습니다.Bash 는 항상 상태의 전경 작업입니다.모니터링 플래그에만 적합한 백그라운드 작업,그리고 대화형으로만 껍질지,스크립트가 있습니다.

보 notify_of_job_status()에서 작업입니다.c.

당신 말대로 리디렉션할 수 있습니다 그래서 표준 오류를 가리키는/dev/null 하지만 당신이 놓치고 다른 어떤 오류 메시지를 가지고 있습니다.당신은 그것을 만들 수 있는 임시을 수행하여 리디렉션에는 스크립트를 실행합니다.이것은 원래의 환경에 혼자입니다.

(script 2> /dev/null)

는 것을 모두 잃게 오류 메시지,하지만 단지에서 스크립트가 아닌 다른것에서 실행하는 shell.

저장할 수 있는 복원이 표준오류,리디렉션하여 새로운 filedescriptor 을점이 있:

exec 3>&2          # 3 is now a copy of 2
exec 2> /dev/null  # 2 now points to /dev/null
script             # run script with redirected stderr
exec 2>&3          # restore stderr to saved
exec 3>&-          # close saved version

그러나 나는 권장하지 않습니다 이것뿐이 거꾸로에서 첫 번째 중 하나는 저장 sub-shell 호출되고 있는 동안 더 많은 복잡하고,가능성도 동작을 변경하는 스크립트의 경우 스크립트를 변경하는 파일기술자.


편집:

더 많은 적절한 대답을 확인에 의해 주어진 대 Mark Edgar

다른 팁

기 위해서는 침묵하는 메시지여야 합 리다이렉션 stderr 시간에 메시지가 생성.기 kill 명령을 보내는 신호를 기다리지 않 대상 프로세스에 대한 응답,리다이렉션 stderrkill 명령은 당신에게 아무 소용이 없다.Bash 내장 wait 었다 이러한 목적으로 특별히 제작.

여기에는 것은 매우 간단한 예제는 죽이고 가장 최근에 바탕 명령입니다.(에 대해 더 알아보$!여기에.)

kill $!
wait $! 2>/dev/null

killwait 러 pid,당신은 또한 배치를 죽인다.여기에 예를 죽이는 모든 백그라운드 프로세스(현재 프로세스의/의 스크립트론).

kill $(jobs -rp)
wait $(jobs -rp) 2>/dev/null

나도 여기에서 bash:자동으로 죽이는 배경 기능 프로세스.

행진의 응답.용 kill -INT 으로 그는 몇 가지 성공을 하지만,나는 그것을 죽이는 프로세스입니다.후에 테스트를 다른 어떤 신호를 내가 보니 SIGPIPE 를 죽이는 것뿐만 아니라없이 메시지입니다.

kill -PIPE

또는 단순히

kill -13

솔루션:사용 SIGINT(에서만 작동합 non-interactive shells)

Demo:

cat > silent.sh <<"EOF"
sleep 100 &
kill -INT $!
sleep 1
EOF

sh silent.sh

http://thread.gmane.org/gmane.comp.shells.bash.bugs/15798

어쩌면 분리 프로세스에서는 현재 쉘 프로세스를 호출하여 disown?

이것이 우리가 무엇을 모두 찾고 계십니까?

원하지 않:

$ sleep 3 &
[1] 234
<pressing enter a few times....>
$
$
[1]+  Done                    sleep 3
$

원하는:

$ (set +m; sleep 3 &)
<again, pressing enter several times....>
$
$
$
$
$

당신이 볼 수 있듯이,직업 종료 메시지입니다.나를 위해 bash 스크립트에서뿐만 아니라,또한 살해 배경을 처리합니다.

'세+m'비활성화 작업을 제어하십시오(는 데 도움이'설정')이 현재 쉘입니다.그래서 만약 당신이 입력한 명령어에(수행 여기에 괄호 안에)당신에 영향을 미치는 것은 아닙 작업을 제어 설정을 현재의 쉘입니다.만 불리는 당신이 얻을 필요가 pid 배경의 과정을 다시 현재 쉘을 경우 당신은 여부를 확인하려면 그것은 종결되거나 평가를 반환 코드입니다.

또 다른 방법을 사용 작업 알림을 당신의 명령을 백그라운드에서 sh -c 'cmd &' 구조물이다.

#!/bin/bash
# ...
pid="`sh -c 'sleep 30 & echo ${!}' | head -1`"
kill "$pid"
# ...

# or put several cmds in sh -c '...' construct
sh -c '
sleep 30 &
pid="${!}"
sleep 5 
kill "${pid}"
'

이것은 또한 작품에 대한 killall(선호하는 사람들을 위해 그것):

killall -s SIGINT (yourprogram) 

을 억제하는 메시지...실 mpg123 에서 배경 모니다.그것은 수로에 의해 살해를 보내려면 ctrl-c(SIGINT)대 SIGTERM(기본값).

모른다고 했는 정확하게 오른 것은 나를 위해--exec3>&2 은 위험에 대한 많은 이유--설정+bm 보이지 않았 작업 스크립트 내에서,만 명령 프롬프트에서

성공적으로 추'jobs 2>&1 >/dev/null'하는 스크립트를 특정하지 않는 경우에 그것은 사람을 도움이 될 것입니다 다른 스크립트,하지만 여기 샘플입니다.

    while true; do echo $RANDOM; done | while read line
    do
    echo Random is $line the last jobid is $(jobs -lp)
    jobs 2>&1 >/dev/null
    sleep 3
    done

내가 찾는 퍼팅 kill 명령이 함수에서 다음 백그라운드 처리 기능을 억제 종료 출력

function killCmd() {
    kill $1
}

killCmd $somePID &

간단하다:

{ kill $! } 2>/dev/null

장점이 있나요?사용할 수 있습니다 어떤 신호

ex:

{ kill -9 $PID } 2>/dev/null
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top