私は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