이미 실행중인 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.