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이 정의되지 않았습니다(사용을 고려하십시오).[이메일 보호됨]--사용자가 다른 사용자와 연결하는 버스)

콘솔에서 정확히 동일한 명령을 입력하면 제대로 작동하므로 문제는 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

관련 정보