이미 실행중인 prog1에“&& prog2”를 추가 할 수 있습니까?


87

대부분의 쉘 은 특정 방식으로 명령 실행 &&과 같은 기능을 제공합니다 ;. 그러나 명령이 이미 실행 중이면 첫 번째 명령의 결과에 따라 다른 명령을 추가하여 실행할 수 있습니까?

내가 말했어

$ /bin/myprog
some output...

그러나 나는 정말로 원했다 /bin/myprog && /usr/bin/mycleanup. myprog너무 많은 시간이 손실되어 모든 것을 죽이고 다시 시작할 수 없습니다 . 내가 할 수 Ctrl+ Z를하고 fg/ bg필요합니다. 이것은 내가 다른 명령으로 연결할 수 있습니까?

나는 주로 bash에 관심이 있지만 모든 일반적인 껍질에 대한 답변을 환영합니다!

답변:


118

wait명령 을 사용하는 것과 동일한 쉘 에서이 작업을 수행 할 수 있어야합니다 .

$ sleep 30 &
[1] 17440

$ wait 17440 && echo hi

...30 seconds later...
[1]+  Done                    sleep 30
hi

배쉬 맨 페이지에서 발췌

wait [n ...]
     Wait for each specified process and return its termination status. Each n 
     may be a process ID or a job specification; if a job spec is given,  all 
     processes  in that job's pipeline are waited for.  If n is not given, all 
     currently active child processes are waited for, and the return status is 
     zero.  If n specifies a non-existent process or job, the return status is 
     127.  Otherwise, the return status is the exit status of the last process 
     or job waited for.

명령을 기다리는 것이 작업을 수행해야합니다.
BillThor

거기 같은 백그라운드로 프로세스의 PID를 입력하는 짧은 형태의 번호는 %, %1$!. PID를 제공하는 것이 중요합니다. 그렇지 않으면 두 번째 명령이 항상 실행됩니다.
BillThor

@ BillThor-당신은 대답을 자격이 있거나 나에게 이것을 말하고 있습니까?
slm

답변을받을 자격이 있습니다. 평원 wait은 원하는 결과를 제공하지 못할 것입니다. 짧은 형식은 오타가 적기 때문에 사용하는 것이 일반적입니다.
BillThor

2
반짝이는 새 배지를 가장 먼저 축하해 드리겠습니다. :)
terdon

63

fg재개 된 프로그램에서 종료 코드와 함께 리턴합니다. 따라서 프로그램을 일시 중단 ^Z한 다음 fg && ...다시 시작하는 데 사용할 수 있습니다.

$ /bin/myprog
some output...
^Z
[1]+ Stopped              /bin/myprog
$ fg && /usr/bin/mycleanup

종료하기 전에 다시 일시 중단하고 다른 명령으로 동일한 작업을 수행하면 mycleanup의 초기 체인이 교체됩니까?
Burhan Ali

3
@BurhanAli myprog두 번째로 일시 중단 fg하면 종료 코드 20 (0이 아닌)으로 종료되므로 체인 mycleanup명령이 실행되지 않습니다.
n.st

1

요청한 것이 가능한지 확실하지 않지만 프로그램을 시작한 쉘이 여전히 있으면 항상 $?마지막 프로세스의 종료 상태를 확인할 수 있습니다.

$ /bin/myprog
some output...
$ if [ $? -ne 0 ];then echo "non-zero exit status";else echo "0 exit status";fi

1
이것은 작동하지만 나중에 수동으로 실행해야하며 명령이 완료되면 자동으로 실행하려고합니다.
slm

@slm 동의합니다. 정확한 문제에 대한 해결책이 없습니다.
Joseph R.

3
waitBash 에서 명령을 확인하십시오 .
slm

1

작업이 포 그라운드에있는 경우 이러한 명령 중 하나가 예상 한 것과 동일하게 작동합니다.

[ $? -eq 0 ] && prog2
(( $? )) || prog2

참고 : $? 종료 될 때 실행중인 프로그램의 리턴 상태를 포함합니다.

이것은 원래 명령을 입력 한 경우 쉘이 수행 할 작업을 명시 적으로 나타냅니다.

prog1 && prog2

첫 번째 명령을 읽지 않고 stdin포 그라운드에서 실행중인 경우 첫 번째 명령이 실행되는 동안 새 명령을 입력 할 수 있습니다. 쉘은 첫 번째 명령이 실행될 때이를 읽고 실행합니다. 명령이 백그라운드에서 실행되면 읽지 않을 것입니다 stdin.

편집 : 백그라운드에서 작업을 넣고 WAIT명령을 사용할 수도 있습니다. 다른 작업도 백그라운드에서 실행 한 경우주의해서 수행해야합니다. WAIT명령이 대기중인 작업 상태를 리턴하도록 하려면 작업 스펙이 필요합니다 .


이것은 작동하지만 나중에 수동으로 실행해야하며 명령이 완료되면 자동으로 실행하려고합니다.
slm

4
@slm 명령이 stdin을 읽지 않는 한 첫 번째 명령이 실행되는 동안 새 명령을 입력 할 수 있습니다. 쉘은 첫 번째 명령이 완료되는 즉시이를 읽습니다.
BillThor

그가 배경이 된 후에 껍질에서 무언가를하면, 아마도 호스가 붙어있을 것입니다. 적어도 예비에 따르면. 내가 지금까지 해왔 던 테스트!
slm

2
@BillThor 나는 당신이 당신의 답변에 그 의견을 추가해야한다고 생각합니다.
Joseph R.

2
예, 사용하는 wait것도 이상적이지 않습니다. IMO의 장점은 우리가 다루고있는보다 명확한 API를 제공한다는 것입니다. 무언가가 실행 된 후 명령 줄에 더 많은 명령을 입력하면 나에게 약간 해킹 된 것처럼 보였습니다. wait여전히 리턴 상태에서 실행중인 PID에 직접 링크를 얻지 못하고 있습니다. 이것은 Bash가 어떻게 구현하는지에 대한 문제 인 것 같습니다 : stackoverflow.com/questions/356100/… . 그래서 이것은 얻는만큼 좋을 수도 있습니다.
slm
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.