サーバーがパス/sleep
(つまりhttp://hostname/sleep
) へのすべての HTTP 要求でスリープし、スリープする前に完全な応答 ( 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
(有効にする必要はありません) に配置します。
答え2
明らかな解決策は
echo "sleep 1 && sudo systemctl suspend" | at now