Systemdユーザサービスとタイマーを使ったタスク管理アプリを作成してみました。

https://github.com/ktkr3d/systemd-user-task-manager

2026-05-20

スケジュール文字列のバリデーション機能を追加しました。
https://github.com/ktkr3d/systemd-user-task-manager/releases/tag/v0.2.0

概要

  • 指定時刻にコマンドを実行するタスクを管理します。
  • タスクはSystemdのユーザサービス/ユーザタイマーのユニットで実現します。このアプリではuser-task-のプレフィックスで始まるユニットを管理します。ユニットファイルは~/.config/systemd/user/に生成されます。
  • 起動スケジュールとしてSystemdカレンダーイベント書式や起動時(X分後)の指定が可能です。
  • 配布パッケージはFlatpakです。

環境

環境1

  • Arch Linux
    • libadwaita 1.9.0
    • python-gobject 3.56.3

環境2

  • Windows 11 Pro
    • WSLg (Arch Linux)
      • libadwaita 1.9.0
      • python-gobject 3.56.3

構築

インストールと実行 (コマンドライン)

  1. flathub リポジトリ追加
    flatpak --user remote-add --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo
  2. Flatpakアプリケーションパッケージをダウンロード
    https://github.com/ktkr3d/systemd-user-task-manager/releases
  3. Flatpakアプリケーションのインストール
    flatpak --user install systemd-user-task-manager.flatpak
  4. 実行
    flatpak run io.github.ktkr3d.systemd-user-task-manager

インストールと実行(ソフトウェア アプリ)

  1. flathub リポジトリ追加
    flatpak --user remote-add --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo
  2. Flatpakアプリケーションパッケージをダウンロード
    https://github.com/ktkr3d/systemd-user-task-manager/releases
  3. systemd-user-task-manager.flatpakをダブルクリック
  4. ソフトウェア アプリ画面で「ローカルファイル▼」をクリックし、「ユーザー」に切り替える。
  5. 「インストール」
  6. 「開く」

アンインストール(コマンドライン)

  1. Flatpakアプリケーションパッケージの削除
    flatpak --user uninstall io.github.ktkr3d.systemd-user-task-manager
  2. (任意)作成されたsystemdユニットファイルの削除
    rm ~/.config/systemd/user/user-task-*

アンインストール(ソフトウェア アプリ)

  1. ソフトウェア アプリで「Systemd User Task Manager」アプリをアンインストール
  2. (任意)必要に応じてデータの削除を選択

利用

動作確認

  • テスト
    タスク名
    test
    実行コマンド(サウンド再生)
    aplay /usr/share/sounds/alsa/Front_Center.wav
    スケジュール(カスタム:毎時0分から2分おきに実行)
    *:0/2

使い方

  • スケジュール指定のカレンダーイベントの仕様
    https://man.archlinux.org/man/systemd.time.7#CALENDAR_EVENTS

  • よく使う設定

    実行タイミング 設定例
    毎日0時5分 0:05
    毎週月曜日 Mon
  • 指定間隔毎に実行する設定

    実行タイミング 設定例
    毎時 hourly または *:00
    毎時0分から5分毎に実行(0分, 5分, 10分, 15分 …) *:0/5
    毎時0分から15分毎に実行(0分, 15分, 30分, 45分) *:0/15
    毎日 daily または 00:00
    毎月1日から3日毎に実行(1日, 4日, 7日, 10日, …) *-01/3
  • スケジュール指定のチェック方法(次回5回分)

    systemd-analyze calendar  --iterations=5 '*-01/3'
  • ログインしていない状態でもタスクを実行する方法
    systemd のユーザーインスタンスを自動起動

    # loginctl enable-linger username

応用:ずんだもん時報

  1. Windows PC でVOICEVOXをインストール(起動はしない)し、以下コマンドを実行
    "%USERPROFILE%\AppData\Local\Programs\VOICEVOX\vv-engine\run.exe" --host 0.0.0.0
  2. Windows PC のFWで50021/tcpを解放
  3. Linux PCで以下のシェルを作成
    /home/arch/bin/time-signal.sh
    #!/bin/bash

    HOUR=$(date +%-H)
    MINUTE=$(date +%-M)
    TEXT="現在、${HOUR}${MINUTE}分です。"
    REMOTEHOST=192.168.11.2

    curl -s -X POST "${REMOTEHOST}:50021/audio_query?speaker=1" --get --data-urlencode "text=${TEXT}" > query.json
    curl -s -X POST "${REMOTEHOST}:50021/synthesis?speaker=1" -H "Content-Type: application/json" --data-binary @query.json > voice.wav
    aplay voice.wav
  4. タスクを作成
    タスク名
    time-signal
    実行コマンド
    /home/arch/bin/time-signal.sh
    スケジュール(平日朝6〜7時台に0分から5分おきに実行)
    Mon,Tue,Wed,Thu,Fri 6,7:0/5

応用:日次壁紙ダウンロード&切り替え

  1. 以前作成したスクリプトと設定を参照
    https://ktkr3d.github.io/2025/12/21/Systemd-user-timer/
  2. タスクを作成
    タスク名
    download-bing-wallpaper
    実行コマンド
    /home/arch/bin/download_bing_wallpaper.py
    スケジュール
    5:00
    Persistentをオン

応用:日次ファイル転送&削除

  1. スクリプトを作成
    /home/arch/bin/upload-data.sh
    #!/bin/bash

    LOCAL_DIR="/home/arch/Downloads"
    REMOTE_USER="arch"
    REMOTE_HOST="zotac.local"
    REMOTE_DEST="/media/media12/home/Downloads"

    for file in "$LOCAL_DIR"/*; do
    if [ -f "$file" ]; then

    scp -- "$file" "$REMOTE_USER"@"$REMOTE_HOST":"$REMOTE_DEST"/ && \
    rm -- "$file"

    fi
    done
  2. ssh-copy-id しておく
    ssh-copy-id arch@zotac.local
  3. タスクを作成
    タスク名
    upload-data
    実行コマンド
    /home/arch/bin/upload-data.sh
    スケジュール
    daily
    Persistentをオン

応用:WSL環境で実行

  1. 以下のファイルでWSLgが無効になっていないか確認
    %USERPROFILE%\.wslconfig
  2. 環境変数設定
    ~/.bashrc
    export XDG_RUNTIME_DIR=/run/user/$(id -u)
    export DBUS_SESSION_BUS_ADDRESS=unix:path=$XDG_RUNTIME_DIR/bus
    ~/.config/fish/config.fish
    # WSL systemctl --user fix
    set -gx XDG_RUNTIME_DIR /run/user/(id -u)
    set -gx DBUS_SESSION_BUS_ADDRESS unix:path=$XDG_RUNTIME_DIR/bus
  3. 起動
    flatpak run io.github.ktkr3d.systemd-user-task-manager

応用:paruのビルドキャッシュをクリア

  1. タスクを作成
    タスク名
    paru-cache-clear
    実行コマンド
    rm -rf ~/.cache/paru/clone/*
    スケジュール
    weekly
    Persistentをオン

TODO

  • LANG=C を英語にする
  • スケジュール文字列のバリデーション
  • 最新の情報に自動更新
  • 1つのタスクに複数スケジュール
  • 対応言語追加
  • インストール処理の改善