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子プロセスが完了するまでブロックされます。つまり、システムがスリープ状態になるまでWeb要求は完了しません。それでは、最終命令と監督命令をどのように分離するのですか?クイック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(アクティブ化する必要はありません)。

おすすめ記事