스크립트에서 백그라운드 프로세스를 시작하고 스크립트가 끝나면 관리합니다.

스크립트에서 백그라운드 프로세스를 시작하고 스크립트가 끝나면 관리합니다.

스크립트의 데몬과 유사한 프로세스를 실행하고 구성하고 싶습니다.
내 쉘은 Cygwin에서 zsh를 시뮬레이트하고 데몬은SFK, 기본 FTP 서버입니다.

여기서 중요한 사항을 위해 스크립트 초안을 startserv.sh다음과 같이 작성할 수 있습니다.

#!/bin/sh
read -s -p "Enter Password: " pw
user=testuser
share=/fshare
cmd="sfk ftpserv -user=$user -pw=$pw -usedir $share=$share"
$cmd &

스크립트를 실행한 후 startserv.sh프롬프트가 표시되지 않고 중지(종료?)된 후 다음을 수행합니다.

  • CTRL+ C스크립트 및 백그라운드 작업 프로세스 종료;

  • 프로세스를 종료하기 위해 스크립트를 클릭하면 Enter백그라운드에 남아 있습니다.

어쨌든 통과만 할 수 ps있고 볼 수 없기 jobs때문에 프로세스를 종료하려면 잔인한 신호를 보내야 하는데 , 이는 +를 kill -9선호하는 것이므로 피하고 싶은 것입니다 .CTRLC

대리자 ~ 할 것이다백그라운드에서 전체 스크립트를 실행합니다. "will"이지만 read스크립트가 다음과 같이 실행되면 명령이 사용자 입력을 얻을 수 없습니다 startserv.sh &.

실제 서버가 아닌 스테이징 서버가 필요하다는 점에 유의하세요.악마: 즉, 서버 프로세스가 백그라운드에서 실행되고 스크립트가 끝난 후 간단한 대화형 셸 작업(가상 머신 게스트 사용)을 수행하기를 원하지만 셸에서 살아남기 위해 프로세스가 필요하지 않으므로 nohup부적절해 보입니다 . .

답변1

프로세스를 종료하기 위해 스크립트를 클릭하면 Enter백그라운드에 남아 있습니다.

거의! 실제로 를 누르면 스크립트가 이미 종료되었습니다 Enter. 그러나 이것이 프롬프트를 복원할 수 있는 방법입니다(셸이 $PS1프롬프트를 다시 인쇄하므로).

Ctrl+를 클릭하면 C둘 다 종료되는 이유 는 서로 연결되어 있기 때문입니다. 스크립트를 실행하면 쉘이 이를 실행하기 위해 서브쉘을 시작합니다. 이 서브셸을 종료하면 백그라운드 프로세스가 신호에 의해 종료될 수 있습니다 SIGHUP.

별도의 스크립트, 백그라운드 프로세스 및 서브셸

를 사용하면 nohup이러한 사소한 불편함을 없앨 수 있습니다.

#!/bin/sh
read -s -p "Enter Password: " pw
user=testuser
share=/fshare
cmd="sfk ftpserv -user=$user -pw=$pw -usedir $share=$share"
nohup $cmd &

다른 disown옵션

/bin/sh에서 로 전환할 수 있다면 /bin/bash시도해 보는 것이 좋습니다 disown. 자세히 알아보려면 인스턴스를 입력 help disown하세요 bash.

disown -h $cmd &

백그라운드 프로세스를 "적절하게" 종료합니다.

이제 프로세스를 종료할 때 " Ctrl+ C" 를 사용하여 완벽하게 수행할 수 있습니다 kill. 잔인한 메시지를 보내지 마세요 SIGKILL. 대신 다음을 사용할 수 있습니다.

$ kill -2 [PID]
$ kill -15 [PID]

그러면 프로세스에 nice SIGINT(2) 또는 (15)가 전송됩니다. SIGTERM프로세스를 시작한 후 PID 값을 인쇄할 수도 있습니다.

...
nohup $cmd &
echo $!

...또는 더 나은 방법은 스크립트가 a를 기다린 SIGINT다음 백그라운드 프로세스로 다시 보내도록 하는 것입니다.(이렇게 하면 스크립트가 전경에 유지됩니다):

#!/bin/sh
read -s -p "Enter Password: " pw
user=testuser
share=/fshare
cmd="sfk ftpserv -user=$user -pw=$pw -usedir $share=$share"
nohup $cmd &

# Storing the background process' PID.
bg_pid=$!

# Trapping SIGINTs so we can send them back to $bg_pid.
trap "kill -2 $bg_pid" 2

# In the meantime, wait for $bg_pid to end.
wait $bg_pid

a가 SIGINT충분하지 않으면 SIGTERM(15) 대신 a를 사용하십시오.

trap "kill -15 $bg_pid" 2 15

이렇게 하면 스크립트가 SIGINT( Ctrl+ C, kill -2) 를 수신하거나 백그라운드 프로세스에서 ing SIGTERM하는 동안 wait신호만 전달합니다. 이러한 신호가 sfk인스턴스를 종료하면 wait호출이 반환되므로 스크립트도 종료됩니다. :)

관련 정보