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

systemd 트리거로 사용되는 파일을 삽입하여 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

관련 정보