rtcwake -m no
私のシナリオは、寝ている間にコンピューターを起動し、systemd/systemd-suspend
スクリプトを使用してsmplayer
ポッドキャストのキューで私を起こすようにトリガーすることです。
問題は、smplayer
Ubuntu がログイン画面をロードしてログインを待っているため、起動時に実行できないことです。プログラムでログインする方法はありますか? そうでない場合、smplayer
ルートユーザーなどの GUI プログラムを何らかの方法で実行できますか?その間ログイン画面が表示されますか? (今のところ、そのようには機能していません。)
(コンピューターを単純にスリープ状態にしてログアウトしないようにすることは望んでいません。なぜなら、コンピューターをサスペンド/スリープ状態にするときに、それがその日の最後の時間であることを事前に知っておく必要がないようにしたいからです。明確に言うと、すべての場合に自動的にログインするのではなく、この目的でコンピューターが起動されたときのみログインしたいのです。)
私はLTS 16を使用しています。
答え1
ログインに使用できますxdotool
が、いくつか注意すべき点があります。
- xdotool にログイン画面のウィンドウが選択されるようにするには、変数をユーザーに対応するファイル (通常は )
XAUTHORITY
に設定する必要があります。また、変数も設定します。以下のコード サンプルを参照してください。.Xauthority
/home/myuser/.Xauthority
DISPLAY
xdotool
ログインするユーザーとして実行します。(スクリプトは root として実行されます。実際には、 によってスリープ状態になるなど、いくつかの状況ではログインしたユーザーとして実行されます/lib/systemd/systemd-sleep suspend
が、通常の状況、つまり ではsystemctl suspend
、スクリプトは root として実行されます。)- アラームがウェイクアップの原因である場合にのみこれを実行させるには、
linux/rtc.h
API を使用してマシンの現在の時刻 (RTC_RD_TIME
) とアラーム時刻 (RTC_ALM_READ
) ONを比較します/dev/rtc0
。スクリプトの実行時にそれらが近い場合はsystemd/system-sleep
、アラームによってトリガーされたウェイクアップであると推測できます。
サンプルコード:
#!/bin/sh
# /lib/systemd/system-sleep/myscript
# PW64 is a variable holding a base64-encoded password
if [ post = $1 ] && [ suspend = $2 ] && [ $(whoami) = root ]; then
if get_alm_time 10; then # this is an external program you should write to compare RTC_RD_TIME TO RTC_ALM_TIME
export XAUTHORITY=/home/mysuer/.Xauthority
export DISPLAY=:0
su -c "xdotool type $(printf $PW64 | base64 -d)" myuser &&\
su -c 'xdotool key Return' myuser &&\
su -c 'bash my-other-script.sh' myuser
fi
fi