After=multi-user.target 및 기타 시스템 서비스에서 작동하지 않음

After=multi-user.target 및 기타 시스템 서비스에서 작동하지 않음

작동하는 서비스가 있는데 dhcpcd.servicegithub pull을 수행하고 DHCP가 작동하지 않으면 호스트를 확인할 수 없기 때문에 실행한 후에만 작동합니다. network.target이는 DHCP 서비스가 완료되기 오래 전에 수행됩니다. 서비스가 실행 중일 때 (서버) 사용자는 michael로그인되지 않습니다 .

문제는 모든 경우를 처리하기 위해 엄청나게 길고 추악한 지연을 사용하지 않고는 작업할 수 있을 만큼 늦게 실행할 수 없다는 것입니다.

ExecStartPre=sleep 30

서비스는 다음과 같습니다 updatecontinue.service(내가 시도한 여러 조합 중 하나 After=).

# man systemd.service
# man systemd.unit
#
# Debug with (will print errors at the bottom, time is in UTC!):
#   -n50 to show 50 lines
#   sudo systemctl status updatecontinue
#
# Or to get a plot (open with chrome so its searchable):
#   systemd-analyze plot > ~/plot.svg

[Unit]
Description=Check if an update is halfway through, if yes, then update/enable OverlayFS/reboot

[Service]
Type=simple
ExecStart=/home/michael/.venv/terminal/bin/python3 /home/michael/terminal/script/update.py --check
After=dhcpcd.service
User=michael

[Install]
WantedBy=multi-user.target

여기서 정의된 위치에서 시작되지 않는 것을 볼 수 있습니다.

노트

다음과 같이 설정하더라도:

After=dhcpcd.service systemd-update-utmp-runlevel.service systemd-timesyncd.service

여기에 이미지 설명을 입력하세요.

RON 권장 주의사항

systemctl get-default보고서graphical.target

이 서비스를 이용하세요:

[Unit]
Description=Check if an update is halfway through, if yes, then update/enable OverlayFS/reboot

[Service]
Type=idle
ExecStart=/home/michael/.venv/terminal/bin/python3 /home/michael/terminal/script/update.py --check
After=default.target
TimeoutStartSec=0
User=michael

[Install]
WantedBy=default.target

결과 :

여기에 이미지 설명을 입력하세요.

답변1

systemd가 해결하려고 시도하는 일부 충돌을 정의 WantedBy=multi-user.target하고 추가했습니다. After=multi-user.target이 답변 아래에서 더 큰 설명/실험을 볼 수 있습니다.

대신 서비스가 너무 일찍 실행될 경우 서비스가 실패하는 이유를 알아내십시오. 실행하는 대신 서비스/대상을 After=multi-user.target실행하십시오 .After=

After=network.target내 생각 엔 유일한 문제가 네트워크라면 추가하십시오.

사용자 로그인이 필요한 경우 버스를 사용하십시오 --user.

그래픽 세션이 필요한 경우 WantedBy=graphical.target시스템 버스 또는 WantedBy=graphical-session.target사용자 버스를 고려하십시오.


사용하면 관계 를 WantedBy=multi-user.target맺게 됩니다 .multi-user.targetWants=updatecontinue.service

이는 단지 시작되면 updatecontinue.service시작된다는 의미입니다. 시작에 실패 multi-user.target하더라도 updatecontinue.service문제가 되지 않습니다 multi-user.target.

updatecontinue.service그런 다음 관계 를 제공합니다 Requires=multi-user.target. 이것은 중대한 갈등입니다. (시작 Requires=하면Wants=이것,저것도 시작됩니다). 예외: 만약저것장치를 활성화할 수 없습니다.이것장치가 시작되지 않습니다.

따라서 실제로 서로 부팅하는 두 개의 장치만 있는데 이는 아마도 원하는 것이 아닐 것입니다. Requires=명확성을 위해 종속성을 삭제하겠습니다.


Before/ 관계는 작동합니다. 다음은 After/ 없이 상호 작용하는 두 서비스의 예입니다.BeforeAfter

$ systemctl --user cat {early,late}.service
# /home/stew/.config/systemd/user/early.service
[Unit]
Wants=late.service

[Service]
ExecStartPre=sleep 2
ExecStart=sleep 20

# /home/stew/.config/systemd/user/late.service
[Service]
ExecStart=sleep 5

$ systemctl --user start early
$ journalctl --user --since "2 minutes ago" --no-hostname
Mar 08 15:54:42 systemd[1064]: Starting early.service...
Mar 08 15:54:42 systemd[1064]: Started late.service.
Mar 08 15:54:44 systemd[1064]: Started early.service.

동시에 서비스가 시작되는 것을 확인할 수 있습니다.

late.service이제 관계 를 구축해 보겠습니다 After=early.service.

$ systemctl --user cat {early,late}.service
# /home/stew/.config/systemd/user/early.service
[Unit]
Wants=late.service
[Service]
ExecStartPre=sleep 2
ExecStart=sleep 20

# /home/stew/.config/systemd/user/late.service
[Unit]
After=early.service
[Service]
ExecStart=sleep 5

$ systemctl --user start early
$ journalctl --user --since "2 minutes ago" --no-hostname
Mar 08 16:01:09 systemd[1064]: Starting early.service...
Mar 08 16:01:11 systemd[1064]: Started early.service.
Mar 08 16:01:11 systemd[1064]: Started late.service.

이 경우 완료가 late.service시작된 것을 알 수 있습니다(대기 셀이 됩니다).early.serviceExecStartPreactive (running)


서비스와 달리 대상은 "시작됨" 상태로 전환되지 않습니다. 대신, 그들은 "달성"되었습니다. and 를 사용하여 동일한 작업을 시도해 보겠습니다 early.target. late.service하지만 late.service시작하는 데 시간이 좀 걸릴 것입니다.

$ systemctl --user cat early.target late.service
# /home/stew/.config/systemd/user/early.target
[Unit]
Wants=late.service

# /home/stew/.config/systemd/user/late.service
[Service]
ExecStartPre=sleep 2
ExecStart=sleep 5

$ systemctl --user start early.target
$ journalctl --user --since "2 minutes ago" --no-hostname
Mar 08 16:07:27 systemd[1064]: Starting late.service...
Mar 08 16:07:29 systemd[1064]: Started late.service.
Mar 08 16:07:29 systemd[1064]: Reached target early.target.

early.target"도착"에 2초가 걸리는 것을 알 수 있습니다. 이는 모든 목표의 "Wants="가 "활성화" 단계를 완료하고 "활성(실행 중)" 상태로 들어갈 때만 목표가 "달성"된다는 의미입니다.

이것을 알면 이제 After=foo.targeta와의 혼합이 WantedBy=foo.target다소 모순되는 이유를 이해할 수 있습니다. foo.target도착하기 전에 시작하기를 기다리고 있습니다. 그 동안에는 foo.target시작하기 전에 귀하에게 연락을 드리고 싶습니다 .

답변2

최대한 늦게 서비스를 제공하려고 노력 중입니다.

하다After=default.target

기본 대상설정된 값 과 같습니다 systemctl set-default.

SysV 런레벨 및 해당 systemd 대상의 전체 목록은 다음과 같습니다.

0    runlevel0.target, poweroff.target     {Shut down and power off the system.}
1    runlevel1.target, rescue.target       {Set up a rescue shell.}
2    runlevel2.target, multi-user.target   {Set up a non-graphical multi-user system.}
3    runlevel3.target, multi-user.target   {Set up a non-graphical multi-user system.}
4    runlevel4.target, multi-user.target   {Set up a non-graphical multi-user system.}
5    runlevel5.target, graphical.target    {Set up a graphical multi-user system.}
6    runlevel6.target, reboot.target       {Shut down and reboot the system.} 

기본적으로 완료된 systemctl set-default graphical.target모든 것 . 현재 설정된 내용을 확인할 systemctl set-default multi-user.target수 있습니다 .systemctl get-default

수동으로 시작하면 작동하는 서비스가 있지만 부팅 시 시작되지 않습니다.

ExecStartExecStart에 의해 정의된 스크립트를 수동으로 실행하면 작동하지만 시스템 서비스의 컨텍스트에서는 실행되지 않도록 서비스 파일의 구문이나 이에 상응하는 구문을 엉망으로 만드는 것은 쉽습니다 . 정말 테스트와 디버깅이 필요합니다. "타이밍" 문제는 아닌 것 같습니다. 먼저 수동으로 실행되는지 확인하는 것과 같은 간단한 작업을 수행하십시오 /usr/bin/echo hello > /testfile. 실행되지만 시스템 서비스에서 자동으로 실행되지 않으면 이는 시간 문제가 되지 않을 것입니다. 그런 다음 작동이 멈출 때까지 한 번에 한 단계씩 조정 Before하거나 조정하는 조치를 취하십시오.Requires

administration.service파일은 /etc/systemd/system/다음 위치에 있습니다.

#!/bin/bash

[Unit]
Description=administration
After=default.target

[Service]
Type=idle
ExecStart=/root/scripts/administration.sh
TimeoutStartSec=0

[Install]
WantedBy=default.target

/root/scripts/administration.sh파일 맨 위에 root.root with-rwx------ #!/bin/bash`가 있습니다. 첫 번째 줄을 엉망으로 만들면 서비스가 실행되지 않습니다.and has

systemctl list-unit-files | grep administration표시해야 할 내용을 반드시 확인하세요 .활성화됨 {필요에 맞게 구문을 조정하세요}.

systemctl daemon-reloadadministration.service파일이 존재하지만 실행 시 표시되지 않는 경우systemctl list-unit-files

/etc/systemd/system/이 사용자 정의 서비스를 생성할 수 있는 올바른 위치라면 다른 사람들이 게시하도록 하겠습니다. 제가 아는 것은 서비스가 루트 소유인 경우 나에게 효과가 있었고 기본적으로 관리자인 경우에는 말이된다.

답변3

낮잠을 자면서 코딩을 시도하는 것은 좋은 생각이 아닙니다. 문제는 After=[Unit]부분이 아니라 그 [Service]부분에 있는 것이 바보임에 틀림없다는 것입니다!

관련 정보