스크립트의 데몬과 유사한 프로세스를 실행하고 구성하고 싶습니다.
내 쉘은 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
호출이 반환되므로 스크립트도 종료됩니다. :)