우리는 종종 이 문제에 직면합니다. Linux 서버에서 일부 장기 작업을 실행하고 싶지만 네트워크 불안정으로 인해 작업이 중간에 실패합니다. 명령이 제출된 후 터미널 창을 로컬로 닫거나 네트워크 연결을 끊는 방식으로 명령이 방해받는 것을 방지하는 방법은 무엇입니까?
위의 요구 사항을 쉽게 충족할 수 있는 세 가지 방법은 다음과 같습니다.
문제 분석:
사용자가 로그아웃(logout)하거나 네트워크 연결이 끊어지면 터미널이 HUP(hangup) 신호를 수신하고 모든 하위 프로세스를 닫는다는 것을 알고 있습니다. 따라서 우리의 솔루션에는 두 가지 방법이 있습니다. 프로세스가 HUP 신호를 무시하도록 하거나 프로세스가 새 세션에서 실행되어 이 터미널에 속하지 않는 하위 프로세스가 되도록 하는 것입니다.
세 가지 솔루션:
nohup은 의심할 여지없이 우리가 생각하는 첫 번째 솔루션입니다. 이름에서 알 수 있듯이 nohup의 목적은 제출된 명령이 hangup 신호를 무시하도록 만드는 것입니다.
nohup은 처리할 명령 앞에 nohup을 추가하기만 하면 기본적으로 표준 출력 및 표준 오류가 nohup.out 파일로 리디렉션됩니다. 일반적으로 끝에 "&"를 추가하여 동시에 백그라운드에서 명령을 실행하거나 ">filename 2>&1"을 사용하여 기본 리디렉션 파일 이름을 변경할 수 있습니다.
nohup 예시
[root@pythontab ~]# nohup ping www.php.cn & [1] 3059 nohup: appending output to `nohup.out' [root@pythontab ~]# ps -ef |grep 3059 root 3059 984 0 15:06 pts/3 00:00:00 ping www.php.cn root 3067 984 0 15:06 pts/3 00:00:00 grep 3059 [root@pythontab ~]#
nohup은 의심할 여지 없이 HUP 신호를 무시하여 프로세스가 도중에 중단되는 것을 방지할 수 있지만, 다른 각도에서 생각해보면 우리 프로세스가 HUP 신호를 받아들이는 터미널의 하위 프로세스에 속하지 않으면 신호는 당연히 HUP의 영향을 받지 않습니다. setid는 이를 수행하는 데 도움이 됩니다.
setsid는 사용하기에도 매우 편리합니다. 처리할 명령 앞에 setid만 추가하면 됩니다.
setsid 예
[root@pythontab ~]# setsid ping www.php.cn [root@pythontab ~]# ps -ef |grep www.php.cn root 31094 1 0 07:28 ? 00:00:00 ping www.php.cn root 31102 29217 0 07:29 pts/4 00:00:00 grep www.php.cn [root@pythontab ~]#
위 예에서 프로세스 ID(PID)는 31094이고 상위 ID(PPID)는 1(즉, init 프로세스 ID)입니다. 현재 단말기 ID 처리
여기 서브쉘에 대한 또 다른 작은 팁이 있습니다. "()"에 하나 이상의 이름을 포함하면 이러한 명령이 하위 쉘에서 실행될 수 있으므로 많은 흥미로운 기능이 확장되며 그 중 하나가 지금 논의될 것입니다.
"()" 안에 "&"를 넣으면 제출된 작업이 작업 목록에 없다는 것을 알 수 있습니다. 즉, 작업을 통해 볼 수 없습니다. 이것이 왜 HUP 신호의 영향을 피할 수 있는지 살펴보겠습니다.
subshell 예시
[root@pythontab ~]# (ping www.php.cn &) [root@pythontab ~]# ps -ef |grep www.php.cn root 16270 1 0 16:13 pts/4 00:00:00 ping www.php.cn root 16278 15362 0 16:13 pts/4 00:00:00 grep www.php.cn [root@pythontab ~]#
위 예시에서 볼 수 있듯이 새로 제출된 프로세스의 부모 ID(PPID)는 1(init 프로세스의 PID)이며, 이는 현재 터미널의 프로세스 ID가 아닙니다. 따라서 현재 단말의 자식 프로세스에 속하지 않으므로 현재 단말의 HUP 신호에 영향을 받지 않는다.
이에 비해 저는 간단하고 실용적인 setid를 선호합니다. 물론 여기는 모두의 취향에 따라 다르며, 효과에는 큰 차이가 없습니다.
위 내용은 Linux에서 백그라운드로 시스템을 실행하는 방법에 대한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!