Proceso secundario asincrónico en script FastCGI

Proceso secundario asincrónico en script FastCGI

Supongamos que quiero que mi servidor entre en suspensión ante cualquier solicitud HTTP a la ruta /sleep(es decir http://hostname/sleep), pero también envíe una respuesta completa ( HTTP 200) antes de dormir.

UsandonginxconCGI rápido, he configurado la ruta en elnginxconfiguración:

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

Esto invoca el siguiente script ( /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 &

Aunque esto hará que el sistema duerma,CGI rápidose bloqueará hasta que se complete el proceso secundario, lo que significa que la solicitud web no se completará antes de que el sistema entre en suspensión. Entonces, ¿cómo puedo separar ese comando final de la supervisión delCGI rápidopara que la respuesta se complete, pero el comando continúa en segundo plano, en este caso, en última instancia, para suspender el sistema.

Respuesta1

Puede desacoplar el cgi y la suspensión interponiendo un archivo utilizado como disparador de systemd. Consulte man systemd.pathesta activación de una unidad basada en rutas. Tiene la ventaja de no necesitar utilizar sudo desde el cgi.

Crear un archivo de unidad/etc/systemd/system/mycgitrigger.path

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

y habilitarlo. Cambie el script cgi para simplemente escribir cualquier cosa en el archivo /some/writeable/filepara activar el apagado. Coloque el comando de apagado y tiempo de espera breve en un archivo de unidad /etc/systemd/system/mycgitrigger.service(que no necesita estar habilitado).

Respuesta2

La solución obvia sería

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

información relacionada