/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