linux 명령 백엔드 실행 기술 정리(2)

모든 내용을 인터넷에 수집하여 일부분은 간단하게 번역하였다
하나 &
리눅스에서 프론트 데스크에서 어떤 작업을 실행할 때 터미널은 이 작업에 의해 차지된다.백그라운드에서 작업을 실행할 때 터미널을 차지하지 않습니다.& 명령을 사용하여 작업을 백엔드에서 실행할 수 있습니다.실제로 이렇게 하면 명령이 작업 대기열에 배치됩니다.
$ ./test.sh &
[1] 17208
$ jobs -l
[1]+ 17208 Running     ./test.sh &

백그라운드에서 작업을 실행할 때 주의해야 한다. 사용자의 상호작용이 필요한 명령은 백그라운드에서 실행하지 마라. 왜냐하면 당신의 기계가 거기에서 바보같이 기다리기 때문이다.그러나 작업이 백엔드에서 실행되는 것처럼 결과를 화면에 출력해서 작업을 방해할 수 있습니다.백그라운드에서 실행되는 작업에 많은 출력이 발생할 경우 다음 방법을 사용하여 출력을 파일로 리디렉션하는 것이 좋습니다.
command >out.file 2>&1 &

위의 예에서 2>&1는 모든 표준 출력과 오류 출력이 out.file라는 파일로 바뀌는 것을 나타낸다.프로세스를 성공적으로 제출하면 프로세스를 감시하거나 죽일 수 있는 프로세스 번호가 표시됩니다.
예: httpd.conf라는 파일을 찾아서 모든 표준 출력과 오류 출력을 find.dt 파일로 리디렉션합니다.
# find /etc/httpd/ -name "httpd.conf" -print >find.dt 2>&1 &
[2] 7832

이 명령을 성공적으로 제출한 후, 시스템은 프로세스 번호 7832를 제시했다.
프론트 데스크톱에서 실행된 명령에 대해서도 백엔드에서 다시 실행할 수 있다. 먼저 ctrl+z를 누르면 실행된 프로세스를 멈추고 bg 명령을 사용하면 정지된 작업을 백엔드에서 실행한다. 예를 들어 프론트 데스크톱에서 실행 중인tesh.sh 를 사용하여 ctrl+z 를 일시 중지하려면 다음과 같이 하십시오.
$ ./test.sh
[1]+ Stopped     ./test.sh
$ bg %1
[1]+ ./test.sh &
$ jobs -l
[1]+ 22794 Running     ./test.sh &

그러나 위에서 백엔드로 실행된 프로세스와 같이 부모 프로세스는 현재 단말기 셸의 프로세스이고 부모 프로세스가 종료되면 모든 하위 프로세스에 Hangup 신호를 보내고 하위 프로세스가 Hangup을 받은 후에도 종료합니다.셸을 종료할 때 프로세스를 계속 실행하려면 nohup hangup 신호를 무시하거나 setsid 부모 프로세스를 init 프로세스로 설정해야 합니다. (프로세스 번호는 1)
$ echo $$21734
$ nohup ./test.sh &
[1] 29016
$ ps -ef | grep test
515   29710 21734 0 11:47 pts/12 00:00:00 /bin/sh ./test.sh
515   29713 21734 0 11:47 pts/12 00:00:00 grep test
$ setsid ./test.sh &
[1] 409
$ ps -ef | grep test
515   410   1 0 11:49 ?   00:00:00 /bin/sh ./test.sh
515   413 21734 0 11:49 pts/12 00:00:00 grep test

위의 시험은 사용 nohup/setsid& 을 사용하여 프로세스를 백엔드에서 실행하고 현재 셸이 종료되는 영향을 받지 않도록 하는 것을 보여 줍니다.그러면 이미 백엔드에서 실행되고 있는 프로세스에 대해서는 어떻게 해야 합니까?disown 명령을 사용할 수 있습니다.
$ ./test.sh &
[1] 2539
$ jobs -l
[1]+ 2539 Running     ./test.sh &
$ disown -h %1
$ ps -ef | grep test
515   410   1 0 11:49 ?   00:00:00 /bin/sh ./test.sh
515     2542 21734 0 11:52 pts/12 00:00:00 grep test

프로세스를subshell에서 실행해도 setsid 이곡과 같은 방법이 있다.간단합니다. 명령을 괄호()로 묶으면 됩니다.
$ (./test.sh &)
$ ps -ef | grep test
515   410   1 0 11:49 ?   00:00:00 /bin/sh ./test.sh
515   12483 21734 0 11:59 pts/12 00:00:00 grep test

참고: 본 시험 환경은 Red Hat Enterprise Linux AS release 4(Nahant Update 5)이고 셸은/bin/bash이며 OS와 셸에 따라 명령이 다를 수 있습니다.예를 들어 AIX의 ksh는 disown가 없지만 nohup -p PID를 사용하여 disown과 같은 효과를 얻을 수 있다.
그리고 더욱 강력한 방법은 screen를 사용하는 것이다. 먼저 끊는 모드의 가상 단말기를 만들고 -r 옵션으로 이 가상 단말기를 다시 연결하면 그 중에서 실행하는 모든 명령이nohup 효과를 얻을 수 있다. 이것은 여러 명령이 백엔드에서 연속적으로 실행되어야 할 때 비교적 편리하다.
$ screen -dmS screen_test
$ screen -list
There is a screen on:
   27963.screen_test     (Detached)
1 Socket in /tmp/uscreens/S-jiangfeng.
$ screen -r screen_test

2. nohup
프로세스를 실행하고 있고 계정을 종료할 때 프로세스가 끝나지 않을 것 같으면 nohup 명령을 사용할 수 있습니다.이 명령은 계정에서 탈퇴한 후에 상응하는 프로세스를 계속 실행할 수 있습니다.nohup은 끊지 않는다는 뜻(no hang up)이다.명령의 일반적인 형식은 다음과 같습니다. nohup conmmand &nohup 명령을 사용하여 작업을 제출하면, 이 작업의 모든 출력은 nohup.out 라는 파일로 다시 지정됩니다. 출력 파일이 따로 지정되지 않은 경우:
nohup command > myout.file 2>&1

위의 예에서 출력은 myout.file 파일로 다시 지정됩니다.

좋은 웹페이지 즐겨찾기