web-dev-qa-db-ja.com

シャットダウン、一時停止は、でスケジュールされたときに認証が必要です

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を使用しています。

2
Matthias Braun

おそらく、atによって実行されるコマンドは、ttyデバイスやdbus設定などにアクセスできない別の環境にあります。

Systemdには独自のバージョンのatコマンドがあります。これを使用して、systemdコマンドをさらに実行しても問題ないと思われる環境でコマンドを実行できます。したがって、同等のコマンドを使用します。

systemd-run --user --on-active=5min /bin/systemctl suspend

5分の待機時間で完全な精度を得るには、オプション--timer-property=AccuracySec=1を追加する必要があります。

1
meuh