cronjobがsystemcltユーザーユニットを再起動できるようにする

cronjobがsystemcltユーザーユニットを再起動できるようにする

私はsystemctlを持っていますユーザー単位:

[Unit]
Description=my app
Wants=network.target
After=syslog.target network-online.target

[Service]
Type=exec
ExecStart=/home/user/bin/myapp
StandardOutput=append:/home/user/log.log
StandardError=append:/home/user/log.log
Restart=on-failure
RestartSec=10
KillMode=process

[Install]
WantedBy=multi-user.target

私はこのcronjobを作りました:

* *  *   *   *    /usr/bin/systemctl restart --user myapp.service

ただし、次のエラーが原因で失敗します。

バスに接続できません:$ DBUS_SESSION_BUS_ADDRESSおよび$ XDG_RUNTIME_DIRは定義されていません(使用を検討してください)。[Eメール保護]--ユーザーが他のユーザーと接続するバス)

コンソールでまったく同じコマンドを入力すると正常に動作するため、問題はtyo cronにのみ関連しています。

私はまた、次のような他の答えを見つけました。これしかし、cronで使用するためにこれらの変数を設定する方法はわかりません。

ところで、私はUbuntu 22.04を使用しています。

答え1

まず、ユーザーを維持する必要があります。

# loginctl enable-linger <user>

その後、正常にログインするか、次の操作を<user>行う必要があります。

sudo machinectl shell <user>@.host

入力後、これらの環境変数をcrontabにコピーします。

あなたのcrontabは次のようになります:

DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/<uid>/bus
XDG_RUNTIME_DIR=/run/user/<uid>
* *  *   *   *    /usr/bin/systemctl restart --user myapp.service

一方、目標を変えなければなりません。ユーザーの目標はシステムの目標とは異なります。ユーザーが利用できる目標を一覧表示するには、次の手順に従ってください。

$ systemctl --user --type=target

関連情報