다음과 같은 bash 스크립트가 있습니다.
bundle exec middleman server & node script.js &&
kill -9 $(lsof -i:4567 -t) &&
bundle exec middleman build --verbose
이제 번들 exec 중간자 서버를 종료하는 방법은 포트(localhost:4567)를 기반으로 종료하는 것입니다. 그러나 포트를 변경해야 하는 경우에는 이는 좋지 않습니다.
Node script.js를 실행한 후 Bundle exec man-in-the-middle 서버를 종료하는 가장 좋은 방법은 무엇입니까? (기본적으로 서버가 온라인 상태가 될 때까지 기다리고 get 요청을 보내고 반환된 서버 데이터에 대해 일부 작업을 수행합니다.) 포트에 의존하지 않는 작업을 수행하고 싶습니다. 이름이나 두 번째로 최근에 실행된 항목(또는 가장 최근에 실행 중인 서버?)으로 종료하고 싶습니다.
매우 감사합니다!
답변1
셸에 따라 백그라운드 작업을 쉽게 종료할 수 있습니다. 백그라운드에서 실행 중인 다른 항목이 없으면 작업 1이 되므로 다음을 수행할 수 있습니다 kill %1
.
sauer@host:~$ set -b
sauer@host:~$ sleep 10 & echo hello
[1] 18988
hello
sauer@host:~$ kill %1
[1]+ Terminated sleep 10
백그라운드에서 다른 작업이 진행 중인 경우 수행할 수 있는 몇 가지 작업이 있습니다. Bash 또는 셸이 유사하게 작동한다고 가정하면 jobs -r
실행 중인 작업 목록을 가져오고 작업 번호를 파악하거나 숫자 대신 작업 사양에 프로세스 이름(백분율 뒤에 오는 내용)을 지정할 수 있습니다. 아마도 kill %bundle
. 또는 이 경우 가장 유용한 것은 %+
가장 최근의 백그라운드 작업을 참조하는 데 사용할 수 있다는 것입니다.
sauer@host:~$ set -b
sauer@host:~$ sleep 10 & sleep 11 & echo hello
[1] 19406
[2] 19407
hello
sauer@host:~$ kill %+
[2]+ Terminated sleep 11
백그라운드에서 두 개의 휴면 프로세스가 실행되고 있지만 이는 %+
"가장 최근" 프로세스이므로 종료됩니다. set -b
다음 프롬프트를 기다리지 않고 백그라운드 작업 상태에 대한 즉각적인 피드백을 제공 할 수도 있습니다. 이는 단지 예일 뿐입니다. :)
아, 그리고 여기에 이름으로 백그라운드 작업을 종료하는 방법과 테마가 있으므로 패턴이 여러 프로세스와 일치하는 경우 어떤 일이 발생하는지 보여주는 유용한 예가 있습니다. "jobs" 출력에는 +
최신 작업과 두 번째로 최근 작업에 대한 합계 표시기가 표시되며, 이는 작업 사양에서 약칭으로 사용될 수 있습니다.-
sauer@host:~$ sleep 10 & sleep 11 & sleep 9 & echo hello
[1] 22255
[2] 22256
[3] 22257
hello
sauer@host:~$ jobs
[1] Running sleep 10 &
[2]- Running sleep 11 &
[3]+ Running sleep 9 &
sauer@host:~$ kill %sleep
-bash: kill: sleep: ambiguous job spec
sauer@host:~$ kill %"sleep 10"
[1] Terminated sleep 10