당신은 아마 이것을 할 수있는 많은 방법이 있다고 말할 수 있습니다.
"업데이트 # 2"와 관련하여 일반적으로 부모-자식 계층에서 프로세스를 종료하면 일반적으로 모든 관련 프로세스가 종료됩니다. 그러나 이것에는 많은 예외가 있습니다. 프로세스 트리에서 최종 '자식'을 종료하는 것이 이상적입니다. 그런 다음이 자식의 부모는 실행할 다른 작업이없는 경우 종료해야합니다. 그러나 부모를 죽이면 부모가 죽을 때 신호가 아이들에게 전달되어야하고 아이들도 종료해야합니다. 그러나 자식 프로세스가 트랩이나 유사한 메커니즘을 통해 신호를 무시하고 계속할 수있는 경우가 있습니다 를 실행하는 것은 'init'프로세스 (또는 이와 유사한 것)에 의해 상속됩니다. 그러나이 프로세스 동작의 주제는 복잡해질 수 있습니다.
제어 스크립트를 사용하지 않으려는 경우 (다음 설명 참조) 방법 중 하나는 'screen'유틸리티를 사용하여 프로세스를 시작하고 관리하는 것입니다. 'screen'명령은 기능으로 가득하며 마스터하는 데 시간이 걸릴 수 있습니다. 자세한 설명은 'screen'맨 페이지를 읽어 보시기 바랍니다. 백그라운드에서 프로세스를 시작하는 간단한 예는 다음과 같습니다.
화면 -d -m / path / to / program
'스크린'세션 내에서 "/ path / to / program"이 시작됩니다.
다음 명령으로 실행중인 세션을 볼 수 있습니다.
화면 -ls
그리고 언제든지 다음 명령으로 실행중인 프로그램에 다시 연결할 수 있습니다.
화면 -r
그런 다음 ^ C 등으로 종료하십시오.
프로세스를 자유롭게 다시 연결하고 연결을 끊을 수 있다는 것 외에도 'screen'은 프로그램이 생성 할 수있는 stdout ()을 캡처한다는 것입니다.
그러나이 문제에 대한 개인적 선호는 프로세스의 시작과 중지를 관리하는 제어 프로그램을 갖는 것입니다. 이것은 다소 복잡해질 수 있으며 다소 복잡한 스크립팅이 필요합니다. 다른 스크립트와 마찬가지로 수십 가지 좋은 방법이 있습니다. 필자는 일상적으로 응용 프로그램을 시작하고 중지하는 데 사용하는 방법에 대한 bash 예제를 포함 시켰습니다. 작업이 단순하면 제어 스크립트에 직접 삽입하거나이 제어 스크립트가 다른 외부 프로그램을 호출하도록 할 수 있습니다. 이 예제는 프로세스 관리 측면에서 포괄적 인 것은 아닙니다. "start"옵션을 사용할 때 스크립트가 이미 실행되고 있지 않은지 확인하고 실행중인 PID가 실제로 시작한 프로세스인지 확인합니다 (예 : 스크립트가 ' t가 죽고 동일한 PID를 사용하여 다른 프로세스가 시작되었으며 스크립트가 첫 번째 'kill'요청에서 실제로 응답 (종료)되었는지 확인합니다. 이 모든 검사를 수행하면 복잡해질 수 있으며 예제를 너무 길고 복잡하게 만들고 싶지 않았습니다. 쉘 스크립팅을 연습하기 위해 예제를 수정하려고 할 수 있습니다.
다음 코드를 "programctl"파일에 저장하고 명령을 사용하여 실행 가능하게하십시오.
chmod 755 프로그램
그런 다음 파일을 편집하고 "myscript"로 시작하는 사례 섹션에 코드 / 스크립트를 추가하십시오.
"programctl"이 현재 디렉토리에 있다고 가정하면 모든 것이 완료되면 다음을 사용하여 프로그램을 시작할 수 있습니다.
./programctl start
그리고 그것을 중지하십시오 :
./programctl 정지
건배.
#!/bin/bash
# Description: A wrapper script used to stop/start another script.
#--------------------------------------
# Define Global Environment Settings:
#--------------------------------------
# Name and location of a persistent PID file
PIDFILE="/tmp/tmpfile-$LOGNAME.txt"
#--------------------------------------
# Check command line option and run...
# Note that "myscript" should not
# provided by the user.
#--------------------------------------
case $1
in
myscript)
# This is where your script would go.
# If this is a routine 'bash' shell script, you can enter
# the script below as illustrated in the example.
# Or you could simply provide the path and parameters
# to another script such as /dir/name/command -options
# Example of an embedded script:
while true
do
# do something over and over...
sleep 1
done
# Example of an external script:
/usr/local/bin/longrun -x
;;
start)
# Start your script in the background.
# (Note that this is a recursive call to the wrapper
# itself that effectively runs your script located above.)
$0 myscript &
# Save the backgound job process number into a file.
jobs -p > $PIDFILE
# Disconnect the job from this shell.
# (Note that 'disown' command is only in the 'bash' shell.)
disown %1
# Print a message indicating the script has been started
echo "Script has been started..."
;;
stop)
# Read the process number into the variable called PID
read PID < $PIDFILE
# Remove the PIDFILE
rm -f $PIDFILE
# Send a 'terminate' signal to process
kill $PID
# Print a message indicating the script has been stopped
echo "Script has been stopped..."
;;
*)
# Print a "usage" message in case no arguments are supplied
echo "Usage: $0 start | stop"
;;
esac