crontab 작업을 사용하여 간단한 "apt-get 업데이트 및 업그레이드" 스크립트를 어떻게 실행할 수 있나요?

crontab 작업을 사용하여 간단한 "apt-get 업데이트 및 업그레이드" 스크립트를 어떻게 실행할 수 있나요?

update.sh를 다음과 같이 생성했습니다.

#!/bin/bash 
       sudo apt-get update 
       sudo apt-get upgrade
       echo "Updated Successfully!

매시간 이 스크립트를 실행하기 위해 다음 crontab 작업을 만들었습니다.

0 * * * *  bash /home/ubuntu/update.sh >> /home/ubuntu/cron_test.txt

그러나 echo 명령에 대한 로그 파일 항목만 생성되고(1분마다 실행하려고 시도하기 때문에) 내 bash가 업데이트되고 있다는 확인은 없습니다. 나는 WSL2와 VMWare Ubuntu 터미널 모두에서 이것을 시도했습니다. WSL에서는 에코 실행 항목도 기록하지 않습니다. 무엇이 문제일까요?

답변1

두 가지 질문이 있습니다:

  1. 이는 sudo비밀번호를 묻는 메시지가 표시되고 비밀번호는 제공되지 않음을 의미합니다. 그래서 그냥 거기에 매달릴 것입니다. 간단한 해결책은 루트를 사용 cron하거나 sudo crontab -e루트 사용자에게 항목을 추가하여 /etc/cron.crontab.sudo

  2. apt 명령 자체도 를 실행할 때 설치를 확인해야 한다는 메시지를 표시합니다 apt upgrade. 를 실행하여 이 문제를 해결할 수도 있습니다 apt upgrade -y.

이제 위의 "해결책" 중 어느 것도 좋지 않습니다. 대신에 다음 중 하나를 사용하지 마십시오.무인 업그레이드 설치, 이를 수행하도록 설계된 도구를 사용하면 됩니다.

답변2

몇 가지 문제에 직면해 있습니다. 둘 다 기본적으로 Systemd를 실행하는 WSL에 뿌리를 두고 있습니다(또는 쉽지는 않습니다). 이 내용은 기사에서 자세히 다룹니다.우분투 답변 물어보기또 다른뿌리, 따라서 여기서는 이 문제에 대해 깊이 논의하지 않겠습니다.

그러나 Systemd가 없으면:

  • unattended-upgrades댓글과 다른 답변에서 제안된 은 작동하지 않습니다.

  • cron일반적으로 Ubuntu에서도 Systemd에 의해 시작되므로 다른 방법으로 시작 해야 합니다 . 귀하의 의견을 바탕으로:

    에코 실행 항목도 기록하지 않습니다.

    cron... WSL에서 예상되는 전혀 실행되지 않는 것 같습니다 .

그러나 가능한 솔루션을 제안하기 전에 WSL 인스턴스에서는 이 작업을 수행하면 안 된다는 점을 제안합니다. WSL 인스턴스는 장기간 실행되는 상시 실행 환경으로 설계되지 않았습니다. 배포판을 실행하는 Docker 컨테이너와 비슷합니다. 그래서 저는 항상 백그라운드에서 업그레이드 중단이 발생하는 것을 걱정합니다. 호스트 운영 체제 wsl --shutdown(또는 호스트 운영 체제) 또는 다양한 요인 --terminate을 포함하여 다양한 요인 중 하나로 인해 백그라운드/무인 업그레이드 중에 WSL 인스턴스가 중지될 수 있습니다 .

물리적/가상 머신에서는 다음 unattended-upgrade-shutdown을 수행할 수 있습니다.무인 업그레이드가 완료될 때까지 종료를 비활성화합니다.. 그러나 이는 WSL에서는 불가능합니다. 즉, Apt 데이터가 손상되기 쉽습니다.

apt upgrade이는 프로세스에서 실행될 때도 발생합니다 cron.

그냥 수동으로 실행하는 것이 좋습니다 sudo apt update && sudo apt upgrade -y. 기본 MOTD는 필요할 때 어느 정도 경고합니다.


WSL에서 실행 하는 경우 cron몇 가지 다른 방법으로 자동화를 달성할 수 있습니다. 권장되는 방법은 boot.command사용 가능한 구성 설정이 있는 Windows 11입니다.

Windows 10을 사용하는 경우 다음을 다음 항목에 추가할 수 있습니다 ~/.bashrc.

wsl.exe -u root service cron status > /dev/null || wsl.exe -u root service cron start > /dev/null

wsl.exe명령을 사용하여 비밀번호 없이 루트로 실행합니다.

보다이 슈퍼유저의 답변거기에서 두 가지 기술을 더 자세히 다룹니다.

관련 정보