FastCGI 스크립트의 비동기 하위 프로세스

FastCGI 스크립트의 비동기 하위 프로세스

/sleep내 서버가 해당 경로 (예: )에 대한 모든 HTTP 요청에 대해 절전 모드로 전환하고 절전 모드 전에 http://hostname/sleep완전한 응답( )도 보내길 원한다고 가정해 보겠습니다 .HTTP 200

사용nginx~와 함께빠른CGI, 경로를 구성했습니다.nginx구성:

location /sleep {
    fastcgi_pass unix:/path/to/fcgiwrap.socket;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME /path/to/script.sh;
}

그러면 다음 스크립트( /path/to/script.sh)가 호출됩니다.

#!/bin/sh
# -*- coding: utf-8 -*-
cat << EOF
Content-Type: text/html

<html><head><title>Sleep</title><meta charset="UTF-8"></head>
<body><p>Sleep: $(date)</p></body></html>
EOF
sleep 1 && sudo systemctl suspend < /dev/null > /dev/null 2>&1 &

이로 인해 시스템이 절전 모드로 전환되더라도빠른CGI하위 프로세스가 완료될 때까지 차단됩니다. 즉, 시스템이 절전 모드로 전환되기 전에는 웹 요청이 완료되지 않습니다. 그렇다면 최종 명령을 감독에서 분리하려면 어떻게 해야 합니까?빠른CGI응답은 완료되지만 명령은 백그라운드에서 계속됩니다. 이 경우 궁극적으로 시스템을 절전 모드로 전환합니까?

답변1

시스템 트리거로 사용되는 파일을 삽입하여 cgi와 일시 중단을 분리할 수 있습니다. man systemd.path장치의 경로 기반 활성화에 대해서는 을 참조하십시오 . CGI에서 sudo를 사용할 필요가 없다는 장점이 있습니다.

유닛 파일 생성/etc/systemd/system/mycgitrigger.path

[Path]
PathModified=/some/writeable/file
[Install]
WantedBy=multi-user.target

활성화합니다. /some/writeable/file종료를 트리거하기 위해 파일에 무엇이든 쓰도록 cgi 스크립트를 변경하십시오 . 짧은 시간 제한 및 종료 명령을 단위 파일에 넣습니다 /etc/systemd/system/mycgitrigger.service(활성화할 필요가 없음).

답변2

분명한 해결책은 다음과 같습니다.

echo "sleep 1 && sudo systemctl suspend" | at now

관련 정보