아나크론이 내 임무를 수행하던 중 그 꼬마를 죽였어.

아나크론이 내 임무를 수행하던 중 그 꼬마를 죽였어.

anacron하루에 한 번 백업을 실행하는 작업을 설정하고 싶습니다 (Ubuntu 20.04.3 LTS). GUI를 backintime사용하여 이 작업을 예약했다면 backintime일반적인 crontab을 사용하겠지만 내 사용 사례에서는 적합하지 않습니다. 저는 컴퓨터를 사용하지 않을 때 보통 컴퓨터를 대기 모드로 두므로 사용하지 않을 경우 , cronjob이 삭제되면 컴퓨터가 정확한 예약 시간에 실행될 수 없습니다. 대신 내가 한 일은 스크립트가 처리될 수 cron.daily있도록 디렉토리에 스크립트를 생성하는 것이었고 anacron대기 모드나 컴퓨터가 일정 시간 동안 꺼져 있는 경우에도 지연 실행을 지원합니다. 다음 명령을 추가했습니다.

sudo -i -u samuel /usr/bin/nice -n19 /usr/bin/ionice -c2 -n7 /usr/bin/backintime backup-job >/dev/null

이것이 바로 backintimecrontab에 추가된 것이므로 사용하면 제대로 작동할 것이라고 확신합니다 anacron. 하지만 그렇지 않습니다. 작업은 정상적으로 시작되지만 백업은 완료되지 않습니다. 시스템 로그 출력은 다음과 같습니다.

backintime (samuel/1): INFO: Lock
backintime (samuel/1): WARNING: Inhibit Suspend failed.
backintime (samuel/1): INFO: mount ssh: [...]
backintime (samuel/1): INFO: Take a new snapshot. Profile: 1 Main profile
backintime (samuel/1): INFO: Call rsync to take the snapshot

[... around 10 seconds later ...]

anacron[1082]: Job `cron.daily' terminated (mailing output)
anacron[1082]: anacron: Can't find sendmail at /usr/sbin/sendmail, not mailing output
anacron[1082]: Can't find sendmail at /usr/sbin/sendmail, not mailing output
systemd[1]: anacron.service: Killing process 7920 (python3) with signal SIGKILL.
anacron[1082]: Normal exit (1 job run)
systemd[1]: anacron.service: Killing process 7958 (ssh-agent) with signal SIGKILL.
systemd[1]: anacron.service: Killing process 8107 (ssh) with signal SIGKILL.
systemd[1]: anacron.service: Killing process 8109 (sshfs) with signal SIGKILL.
systemd[1]: anacron.service: Killing process 8112 (python3) with signal SIGKILL.
systemd[1]: anacron.service: Killing process 8126 (rsync) with signal SIGKILL.
systemd[1]: anacron.service: Killing process 8127 (ssh) with signal SIGKILL.
systemd[1]: anacron.service: Killing process 8123 (QXcbEventQueue) with signal SIGKILL.
systemd[1]: anacron.service: Succeeded.

나는 이 상황이 이상하다고 생각합니다. 왜 anacron이 의도적으로 내 프로세스를 종료할까요? 따라서 내 설명에 따르면 백업 스크립트에서 실행한 명령은 Python, ssh, rsync 등과 같은 일부 작업자 프로세스를 분리하고 일단 "종료"되면 백그라운드에서 다시 실행되는 유일한 작업이기 때문에 곧 종료됩니다. start 서버가 종료됩니다. 지금까지는 괜찮았지만 anacron스크립트가 완료되면 원본 백업 스크립트의 모든 하위 항목을 종료하는 것이 책임이라고 생각하는 것 같습니다. 하지만 어떻게 하면 이런 일을 막을 수 있을까요? 백업 스크립트를 종료하기 전에 하위 PID를 수동으로 찾고 모든 PID가 완료될 때까지 기다려야 합니까?

온라인에서 이 동작에 대한 정보를 찾지 못했기 때문에 여기에서 어떻게 해야 할지 제안 사항이 있는 분이 계시다면 기꺼이 알려드리겠습니다.

답변1

편집: 아래 해결 방법은 100% 효과적이지 않았기 때문에 다시 조사한 결과 근본 원인이 anacron 자체가 아니라 시스템 구성에 있음을 발견했습니다. 분명히 systemd 장치는살인 모드기본 프로세스가 완료된 후 생성된 하위 프로세스를 정리하는 데 사용됩니다. Anacron은 이를 "하이브리드"로 설정하고 "없음"으로 변경하면 백업 작업이 백그라운드에서 실행될 수 있었습니다. 다른 유형의 anacron 작업의 경우 하위 프로세스 종료를 비활성화하는 것이 이상적이지 않을 수 있지만 내 사용 사례에서는 이것이 정확히 필요한 것이었습니다.

sudo systemctl edit anacron.service종료 모드는 다음 구성을 입력하여 변경할 수 있습니다.

[Service]
KillMode=none

--

참고용으로 이전 해결 방법을 보관하겠습니다.

저는 이 상황에 대해 어느 정도 신뢰할 수 있는 솔루션을 찾았습니다. backintime제 특별한 경우에는 SSH를 통한 원격 백업이었습니다. 이는 sshfs백업 위치 마운트를 담당하는 프로세스를 시작하고 백업이 완료되면 종료함으로써 수행됩니다. 따라서 스크립트는 백업이 완료되는 시기를 알 수 있도록 프로세스가 다시 시작되고 완료될 때까지 기다릴 수 있습니다.

sudo -i -u samuel /usr/bin/nice -n19 /usr/bin/ionice -c2 -n7 /usr/bin/backintime backup-job >/dev/null

echo "Waiting for SSHFS to start"
until pids=$(pidof sshfs)
do
    sleep 1
done

echo "Waiting for backup to finish (SSHFS [$pids] to exit)"
while ps -p "$pids" >/dev/null 2>&1
do
    sleep 5
done

echo "SSHFS process gone, exiting"

이것은 가장 우아한 해결책은 아닐 수도 있지만 적어도 잘 작동합니다.

답변2

프로세스를 백그라운드에서 실행하고 anacron이나 기타 서비스 단위를 수정하지 않는 방법은 systemd-run유틸리티를 사용하는 것입니다. 기본적으로 깨끗하고 분리된 실행 환경에서 ppid=1 및 간단한 서비스 유형을 사용하여 새로운 .service 단위로 프로그램을 실행합니다.

귀하의 경우에는 backintime자식 프로세스가 생성된 후 종료되므로 or 옵션을 지정 --service-type=forking하거나 사용해야 합니다 . 이러한 방법의 차이점에 대한 자세한 내용은 systemd-run 및 systemd.service 매뉴얼을 참조하세요.--scope-r

관련 정보