at
を使用してラップトップを一時停止したい:
_echo "systemctl suspend" | at now + 5 minutes
_
一時停止は発生しません。代わりに、_/var/spool/mail/me
_のat
からのメールを見つけました。
_Failed to set wall message, ignoring: Interactive authentication required.
Failed to suspend system via logind: Interactive authentication required.
Failed to start suspend.target: Interactive authentication required.
See system logs and 'systemctl status suspend.target' for details.
_
了解しました。logind
が_systemctl suspend
_を実行する場合、at
には認証が必要です。 at
を使用せずに_systemctl suspend
_を直接実行すると、認証が不要になり、マシンが停止するため、これは興味深いことです。
at
で実行されるコマンドは、echo "echo $(who) > who.txt" | at now
を使用して直接実行されるコマンドと同じ非rootユーザーによって実行されることを確認しました。
_/bin/sh
_(bashのエイリアス)を介してコマンドを実行するため、at
で認証が必要であると思われ、_systemctl suspend
_の開始後に_/bin/sh
_を実行しました:認証なしですぐに一時停止が発生し、ネストされたシェルは、at
で実行したときにサスペンドが失敗する理由ではありません。
_echo "reboot" | at now
_と_echo "shutdown now" | at now
_を実行すると、同じ動作と非常によく似たメールが届きます。
私の質問は次のとおりです。logind
は、マシンを一時停止、再起動、またはシャットダウンしようとするのはat
であるとどのように判断し、logind
が認証なしでこれらのコマンドを実行できるようにする必要があることをat
に伝えるにはどうすればよいですか?
at
バージョン3.1.19のArchLinux4.18.1を使用しています。
おそらく、at
によって実行されるコマンドは、ttyデバイスやdbus設定などにアクセスできない別の環境にあります。
Systemdには独自のバージョンのat
コマンドがあります。これを使用して、systemdコマンドをさらに実行しても問題ないと思われる環境でコマンドを実行できます。したがって、同等のコマンドを使用します。
systemd-run --user --on-active=5min /bin/systemctl suspend
5分の待機時間で完全な精度を得るには、オプション--timer-property=AccuracySec=1
を追加する必要があります。