🤖

systemdのタイマーで壁紙をランダムに変更する

2023/12/10に公開

systemdの勉強も兼ねてLinuxで壁紙をランダムで変更するユニットファイルを作りました。似たような拡張機能はあるのですが、Gnome Shellのバージョンアップで使えなくなることがよくあるので、環境に依存せず使えるように自分で作ることにしました。

コマンド本体はgsettingを使用しています。他環境の場合はfeh等に置き換えてください。

$ gsettings set org.gnome.desktop.background picture-uri file:///home/user/Pictures/Background/file01.png

ユニットファイル

ユニットファイルはユーザー環境(.config/systemd/user/)に作成します。システム環境(/etc/systemd/system/)に置いても大丈夫です。ユニット名は任意ですが、.servce.timerで一致している必要があります。

.serviceExecStartに実行するコマンドを記載します。今回はワンライナーで実行していますが、外部のシェルスクリプトを実行することも可能です。

実行頻度は.timerで設定します。下記の例では起動5分後OnBootSec=5min)と前回実行から5分後OnUnitActiveSec=5min)に設定しています。

.config/systemd/user/wallpaper-switch.service
[Unit]
Description=Random wallpaper switch

[Service]
Type=oneshot
ExecStart=/bin/bash -c 'gsettings set org.gnome.desktop.background picture-uri file://"$(ls ~/Pictures/Background/* | shuf | head -n 1)"'
# ExecStart=/home/user/bin/wallpapa-switch.sh
.config/systemd/user/wallpaper-switch.timer
[Unit]
Description=Random wallpaper switch

[Timer]
OnBootSec=5min
OnUnitActiveSec=5min

[Install]
WantedBy=default.target

有効化

ユニットファイルを作成したらdaemon-reloadで設定を適用してください。

動作確認のため、start *.serviceでサービスを1回だけ実行します。正しく設定できていれば壁紙が変更されるはずです。

問題なければenable *.timerを実行して再起動すると有効化されます。

$ systemctl --user daemon-reload
$ systemctl --user start wallpaper-switch.service
$ systemctl --user enable wallpaper-switch.timer

ログ確認

systemctl list-timersjournalctlで実行履歴を確認することができます。

$ journalctl --user -f -u wallpaper-switch.service
12月 09 14:36:05 hostname systemd[1141]: Starting Random wallpaper switch...
12月 09 14:36:05 hostname systemd[1141]: Finished Random wallpaper switch.
12月 09 14:41:55 hostname systemd[1141]: Starting Random wallpaper switch...
12月 09 14:41:55 hostname systemd[1141]: Finished Random wallpaper switch.
12月 09 14:47:05 hostname systemd[1141]: Starting Random wallpaper switch...
12月 09 14:47:05 hostname systemd[1141]: Finished Random wallpaper switch.
12月 09 14:53:05 hostname systemd[1141]: Starting Random wallpaper switch...
12月 09 14:53:05 hostname systemd[1141]: Finished Random wallpaper switch.
12月 09 14:59:05 hostname systemd[1141]: Starting Random wallpaper switch...
12月 09 14:59:05 hostname systemd[1141]: Finished Random wallpaper switch.
$ systemctl --user list-timers
NEXT                         LEFT          LAST                     PASSED        UNIT                    ACTIVATES
Sat 2023-12-09 15:04:05 JST  1min 17s Sat  2023-12-09 14:59:05 JST  3min 42s ago  wallpaper-switch.timer  wallpaper-switch.service
...

参考

https://wiki.archlinux.jp/index.php/Systemd
https://wiki.archlinux.jp/index.php/Systemd/タイマー
https://github.com/zoqaeski/systemd-user-units/blob/master/user/wallpaper.service

Discussion