어둡고 바람이 많이 부는 밤. 갑자기 총소리가 났어요!

어둡고 바람이 많이 부는 밤. 갑자기 총소리가 났어요!

터미널 에뮬레이터를 사용하여 Ubuntu 16.04를 실행하고 있습니다.

두 개의 스크립트가 있습니다: a.shb.sh.  a.sh수신 전화 b.sh.

a.sh

echo "a is running"
sleep 5s
bash b.sh
sleep 5s
echo "a is still running"

b.sh

echo "b is now running"
sleep 1000s
echo "Bananas"

a.sh실행 하고 완료되기 전에 b.sh(바나나를 인쇄하기 전) 중지하고 a.sh실행을 완료하고 "a is still running"을 인쇄 하는 방법이 있습니까 ?

pkill -f b.sh넣어 보려고 했는데 a.sh둘 다 a.sh끝나기도 b.sh전에 멈췄어요 a.sh.

답변1

어느 순간에는 원하는 것에 가까워진 것 같습니다.

a.sh

#!/bin/sh

echo "a.sh running"
sleep 10s
(sleep 10s; pkill -f b.sh) &
bash b.sh
sleep 10s
pkill -f b.sh
echo "a.sh still running"

b.sh    (귀하의 버전과 동일)

echo "b is now running"
sleep 1000s
echo "Bananas"

(sleep 10s; pkill -f b.sh) &a.sh 의 행은 10초 동안 휴면한 후 종료되는 하위 쉘을 생성합니다 b.sh. 그런 다음 하위 쉘을 백그라운드에 배치하여 a.sh계속 실행할 수 있습니다.  a.sh그런 다음 실행하고 b.sh실행하십시오 sleep 1000s. 10초 후에 sleep 10s하위 셸이 완료되고 해당 하위 셸이 실행되어 프로세스가  pkill -f b.sh종료됩니다 . 그런 다음 작업을 재개하십시오. 두 번째 프로세스는 이미 종료되었기 때문에 아무 작업도 수행하지 않습니다 .b.sha.shpkill -f b.shb.sh

실행하면 다음과 같은 일이 발생합니다.

$ ./a.sh
재실행                                              # 즉시
b는 지금 실행 중입니다                                          # 위 내용으로부터 약 10초 후
./a.sh: 6행: 13684 bash b.sh 종료     # 위 내용으로부터 약 10초 후
a.sh는 아직 실행 중입니다.                                        # 위 내용으로부터 약 10초 후
$                                                         #위의 직후

a.sh빠르게 완료되면 즉시 재개할 수 있다는 장점이 있습니다 . 10초 이상 실행되는 b.sh경우에만 시작 됩니다 . 또 다른 대답에서는, 비록 그것이 끝났더라도 시간이 걸리기 전에 유휴 상태여야 합니다.b.shpkilla.shsleeppkillb.sh


다른 사용자풀어 주다코멘트(현재는 삭제됨)님이 말씀하셨습니다

알겠어요

./a.sh
a.sh running
b is now running
Terminated

당신이 보고한 내용이 아닙니다. 어떤 아이디어가 있나요?

어둡고 바람이 많이 부는 밤. 갑자기 총소리가 났어요!

        어둡고 폭풍우가 치는 밤이야, 스누피 저자: 찰스 M. 슐츠

pgrepand 에 대한 인수 pkill는 정규식입니다. 특히 확장 정규식 1 입니다 . 2개를cat 동시에 cut실행 해 보세요 . 그런 다음 실행하면 두 PID가 모두 나열되고 및 임을 확인할 수 있습니다 . pgrep c.tpscatcut

만약 당신이 그랬다면정확히내가 말했듯이, 당신도 나와 같은 결과를 얻어야 합니다. 하지만 나는 당신이 뭔가 다른 일을 했다는 사실에 42명의 Zorkmids를 걸고 싶습니다. 당신은 다음 중 하나를 수행합니다:

  1. a.sh, #!/bin/bash대신 she-bang(첫 번째 줄) 으로 시작하거나#!/bin/sh
  2. a.sh대신 실행 bash a.sh하십시오 ./a.sh.

갑자기 총소리가 났어요!

b.shb 뒤에 임의의 문자가 오고 그 뒤에 가 오는 정규식입니다 . sh자체( b.sh)와 일치 하고 b!sh, b~sh, b&shb7sh등과 도 일치합니다. bush그리고...(기다려보세요)...역시 잘되요 bash!

따라서 pkill -f b.sh모든 bash 프로세스는 물론 b.sh이름에 포함된 다른 프로세스도 종료됩니다. 내가 실행 중인 것을 실행할 때 내 로그인 쉘(적어도 부분적으로 bash 의 영향을 받지 않음 pkill)은 bash이지만 a.sh실행 중입니다 /bin/sh (그러나 b.sh실행 중입니다 bash). 이 pkill -f b.sh명령은 다음을 bash b.sh포함하고 있기 때문에 프로세스를 종료합니다.둘 다 bash그리고 b.sh. 그러나 /bin/sh실행중인 것은 a.sh영향을받지 않습니다.

내가 믿는 대로 실행한다고 가정하면(두 가지 옵션 중 하나), 모두스크립트 프로세스가 실행 중입니다 bash. 그래서 pkill -f b.sh명령이 죽었습니다모두스크립트 프로세스.

pkill -f b.sh(이스케이프 점 으로 변경하여 pkill -f 'b\.sh' 일치시킵니다.오직문자가 아닌 점) 올바른 결과를 얻어야 합니다.
________
1 pgrep(1)
2 두 개의 터미널(셸 창)이 있는 경우 cat | cut -f1터미널 중 하나에서 실행(터미널의 입력 사용)하고 p다른 터미널에서 - 명령을 실행합니다. 터미널만 있는 경우 실행한 다음 sleep 42 | cat | cut -f1 & (그렇지 않으면 sleep파이프라인이 즉시 충돌함) p동일한 창에서 -commands를 실행합니다.

답변2

은행:

bash b.sh

스크립트가 완료될 때까지 기다리며 b.sh제어할 수 없기 때문에 스크립트가 끝날 때까지 스크립트에서 아무 작업도 수행할 수 없습니다.b.sha.sh

b.sh스크립트를 백그라운드로 이동하고 다시 제어권을 부여 하려면 a.sh다음과 유사한 명령을 사용하십시오.

bash b.sh &

그러면 즉시 제어권이 반환되고 a.sh다음과 같은 스크립트를 얻을 수 있습니다.

#!/bin/bash 

echo "a is running"
sleep 1s
bash b.sh &
sleep 2
pkill -f 'b\.sh'
sleep 1s
echo "a is still running"

스크립트는 b.sh여전히 다음과 같습니다.

#!/bin/bash
echo "b is now running"
sleep 1000s
echo "Bananas"

실행 후 다음을 얻게 됩니다:

$ ./a.sh
a is running
b is now running
./a.sh: line 7:  8424 Terminated              bash b.sh
a is still running

"작업 제어 메시지"를 피하려면 하위 쉘을 사용하고 다음 bash b.sh &으로 변경하십시오.

(bash b.sh &)

그리고 실행하면 다음을 얻게 됩니다:

$ ./a.sh
a is running
b is now running
a is still running

편집하다:

"kill" 응답으로 보고한 문제는 실행한 pkill 명령이 pkill -f b.sh매개변수를 정규식으로 사용하고 있다는 것입니다. 정규식은 뒤에 가 오는 b모든 문자 와 일치합니다 . 이는 "bash"라는 이름과 일치하며 프로그램도 실행을 시작합니다 . 이는 프로그램이 종료된 이유를 설명합니다. pkill 명령을 다음으로 변경합니다..sha.sha.sh

pkill -f 'b\.sh'

일치하는 정규식이 일반 문자열 "b.sh"인지 확인하세요.

다음을 입력하여 pkill이 일치하는 프로세스를 확인할 수 있습니다.

ps -f -o pid,cmd,args |grep 'b.sh'

pkill 직전.

grep 'b\.sh'실제로 하나의 pid만 일치하는지 확인 하도록 수정되었습니다 .

답변3

스크립트 를 조기에 종료하려면 스크립트를 백그라운드 작업으로 실행 a.sh해야 합니다 .b.sh

백그라운드 작업으로 실행 되므로 b.sh해당 프로세스 ID(PID)에 액세스할 수 있습니다. 즉, kill이를 사용하여 신호를 내보낼 수 있습니다. 이는 pkill제공한 패턴과 일치하는 다른 프로세스에 신호를 보낼 수 있는 사용보다 안전합니다 .

다음에서 다음을 수행할 수 있습니다 a.sh.

#!/bin/sh

echo "A: I'm alive!"
./b.sh & bpid=$!

echo 'A: Sleeping for a short while'
sleep 2

echo 'A: Signalling B'
kill "$bpid"

echo "A: I'm done here"

$!가장 최근에 시작된 백그라운드 작업의 PID로 확장 됩니다 .

b.sh:

#!/bin/sh

echo "B: I'm alive!"

echo 'B: Sleeping for longer than A does'
sleep 10

echo "B: I'm done here"

실행하세요:

$ ./a.sh
A: I'm alive!
A: Sleeping for a short while
B: I'm alive!
B: Sleeping for longer than A does
A: Signalling B
A: I'm done here

호출이 완료될 때까지 b.sh실제로 종료되지 않을 수도 있습니다 . , 및 의 경우에는 해당되지만 sleep즉시 종료되지는 않습니다.bashdashzshpdkshksh93b.sh

답변4

나는 다음 방법을 사용했습니다. 필요에 따라 작동하도록 b.sh에 줄을 추가했습니다.

a.sh 스크립트는 동일합니다.

script a.sh

echo "a is running"
sleep 5s
bash b.sh
sleep 5s
echo "a is still running"

================================================= = ===

script b.sh

echo "b is now running"
sleep 20s

exit

==>exit 명령이 스크립트에서 나옵니다.

echo "Bananas"

산출

   a is running
b is now running
a is still running

관련 정보