ทำไม apt-get fail เมื่ออัตโนมัติด้วย cron


15

ฉันพยายามใช้ cron เพื่อทำการอัปเดตระบบของฉันโดยอัตโนมัติ คุณสามารถดู crontab คำสั่งและข้อผิดพลาดที่เกิดขึ้นด้านล่าง

เมื่อฉันเรียกใช้ upgrade.sh ในฐานะรูทสคริปต์จะทำงานได้ดี เมื่อ cron รันมันapt-get -y updateจะไม่มีปัญหา แต่aptitude -y safe-upgradeล้มเหลว ฉันคาดเดาข้อผิดพลาดนี้เป็นเพราะมีการปรับปรุงเคอร์เนลซึ่งในทางกลับกันการปรับปรุงด้วงซึ่งจะต้องมีของฉันอย่างชัดเจนว่ามันโอเคที่จะเขียนทับdebconf: (This frontend requires a controlling tty.) /boot/grub/menu.lstแต่ฉันไม่เข้าใจข้อผิดพลาดของเส้นทาง และฉันต้องการอัปเดตที่ไม่ต้องการการควบคุมดูแลของฉัน

ฉันได้อ่านคำถามนี้แล้วและมันก็เป็นวิธีการแก้ปัญหาที่ไม่ได้รับการยอมรับunattended-upgradesและฉันอาจจะใช้มัน แต่ทำไมฉันถึงใช้ cron ไม่ได้? ดูเหมือนว่ามันควรจะง่ายและ linuxy มากขึ้น

crontab

root@daedalus:~/bin# crontab -l
# m h  dom mon dow   command
45 06 * * * ~/bin/upgrades.sh

upgrades.sh

root@daedalus:~/bin# cat upgrades.sh 
#!/bin/bash
/usr/bin/apt-get -y update
/usr/bin/aptitude -y safe-upgrade

ข้อผิดพลาด

debconf: unable to initialize frontend: Dialog
debconf: (TERM is not set, so the dialog frontend is not usable.)
debconf: falling back to frontend: Readline
debconf: unable to initialize frontend: Readline
debconf: (This frontend requires a controlling tty.)
debconf: falling back to frontend: Teletype
dpkg-preconfigure: unable to re-open stdin:
Fetched 37.6MB in 4min 23s (143kB/s)
dpkg: warning: 'ldconfig' not found on PATH.
dpkg: warning: 'start-stop-daemon' not found on PATH.
dpkg: warning: 'update-rc.d' not found on PATH.
dpkg: 3 expected program(s) not found on PATH.
NB: root's PATH should usually contain /usr/local/sbin, /usr/sbin and /sbin.
E: Sub-process /usr/bin/dpkg returned an error code (2)
A package failed to install.  Trying to recover:
dpkg: warning: 'ldconfig' not found on PATH.
dpkg: warning: 'start-stop-daemon' not found on PATH.
dpkg: warning: 'update-rc.d' not found on PATH.
dpkg: 3 expected program(s) not found on PATH.
NB: root's PATH should usually contain /usr/local/sbin, /usr/sbin and /sbin.
Reading package lists...
Building dependency tree...
Reading state information...
Reading extended state information...
Initializing package states...
Writing extended state information...

คำตอบ:


10

ข้อความกำลังบอกคุณว่าPATHตัวแปรสภาพแวดล้อมของคุณไม่ถูกต้อง

ลองเพิ่ม

PATH=/usr/bin:/bin:/usr/sbin:/sbin

crontabไปด้านบนของคุณ

หรือคุณอาจจะใส่เดียวกันบรรทัดบรรทัดที่สองของPATH ~/bin/upgrades.shวิธีการทดสอบของคุณจากบรรทัดคำสั่งและการทดสอบของคุณcrontabควรให้ผลลัพธ์ที่เหมือนกัน


ฉันเห็น. ฉันวางคำสั่งลงในสคริปต์โดยไม่ตั้งใจคิดว่า #! / bin / bash line จะโหลดเส้นทางปกติของรูท เห็นได้ชัดว่าฉันผิด ดังนั้นสิ่งที่กำหนดเส้นทางเริ่มต้นของผู้ใช้ในสถานที่แรกและนำไปใช้อย่างไร?
djeikyb

ทำไม cron ถึงไม่ไปตามทางของผู้ใช้ล่ะ? มันจะดีกว่าที่จะเพิ่มเส้นทางไปยัง crontab หรือสคริปต์ของฉัน มีข้อเสียหรือไม่?
djeikyb

มันควรจะเป็นเพราะเหตุผลด้านความปลอดภัย แต่ฉันเห็นด้วยมันน่ารำคาญ 1) หากคุณใส่ไว้ในสคริปต์ของคุณคุณสามารถใส่PATH=...ไฟล์เช่น~/.envและแหล่งที่มาจากทุกสคริปต์ที่คุณเขียนโดยใช้. ~/.envใกล้ด้านบนของสคริปต์ ถ้าคุณเปลี่ยนPATHคุณต้องแก้ไขไฟล์เดียวเท่านั้น 2) หากคุณใส่เข้าไปcrontabนั่นหมายความว่าคุณไม่จำเป็นต้องแก้ไขสคริปต์ cron ทั้งหมด แต่คุณจะมีสองที่ที่จะแก้ไขหากคุณต้องการเปลี่ยนPATH(เช่น~/.bashrcและcrontab) สิ่งที่ดีกว่านั้นขึ้นอยู่กับคุณ
Mikel

เย็น. ฉันเดาคำถามของฉันคือทำไมมันไม่ปลอดภัย ฉันกำลัง googling ตอนนี้ แต่ยังไม่ได้เกิดอะไรขึ้น อย่างไรก็ตามฉันได้ทำการเปลี่ยนแปลงและฉันจะทำเครื่องหมายเป็นคำตอบในเช้าวันพรุ่งนี้เมื่อมันทำงานในกรณีที่มีสิ่งอื่นที่จะสกปรก
djeikyb

ฉันก็หวังเช่นกัน หากมีเหตุผลทั้งเอกสารและcronรหัสที่มาไม่ได้บอกว่ามันคืออะไร ในทางทฤษฎีแล้วมันอาจเป็นการบังคับให้มีสภาพแวดล้อมที่สอดคล้องกันดังนั้นคุณสามารถคัดลอก crontab จากผู้ใช้รายหนึ่งไปยังอีกคนหนึ่งได้ แต่จะPATHได้รับการเปลี่ยนแปลงเท่านั้นจึงไม่สามารถเป็นเหตุผลได้
Mikel

14

แม้ว่าปัญหาหลักของคุณจะได้รับการตอบแล้วดูเหมือนว่าคุณจะได้รับคำเตือนจาก debconf เพราะคุณกำลังเรียกใช้ apt-get โดยไม่มี tty แบบโต้ตอบ เพื่อกำจัดข้อความเหล่านี้คุณสามารถตั้งค่าตัวแปรสภาพแวดล้อมนี้:

DEBIAN_FRONTEND=noninteractive

1

มีหน้าวิกิพีเดียชุมชนคือเหตุผลว่าทำไม crontab ไม่ทำงาน ในกรณีนี้ดูเหมือนว่าสาเหตุเป็นตัวแปรสภาพแวดล้อมที่ จำกัด ของ cron คุณสามารถเรียกใช้จากเชลล์สคริปต์ใน /etc/cron.daily ได้หรือไม่?


เข้าใจผิดคำตอบของคุณดังนั้นจึงไม่มีความคิดเห็น
luri

0

จากCronHowto :

คุณอาจต้องขยายตัวแปร PATH ของผู้ใช้รูทโดยใส่บรรทัดต่อไปนี้ที่ด้านบนของไฟล์ crontab ของพวกเขา:

PATH = / usr / sbin: / usr / bin: / sbin: / bin

แต่ในความเป็นจริงแล้วทุกอย่างดูเหมือนจะไม่เป็นแบบเดียวกันกับคุณ .... คุณดึงข้อผิดพลาดเหล่านั้นมาจากไหน?

crontab:

root@PORTATIL:/var/log$ crontab -l
* * */2 * * /usr/share/myupdate.sh > /var/log/myupdate.log

SCRIPT:

root@PORTATIL:/etc# cat /usr/share/myupdate.sh 
#!/bin/bash
#Testing updates
apt-get update -y
apt-get upgrade -y

เข้าสู่ระบบ:

root@PORTATIL:/etc# cat /var/log/myupdate.log 

Hit http://security.ubuntu.com lucid-security Release.gpg
Hit http://archive.canonical.com lucid Release.gpg
Hit http://archive.canonical.com lucid Release.gpg
Hit http://packages.medibuntu.org lucid Release.gpg
Get:1 http://dl.google.com stable Release.gpg [197B]
Hit http://ppa.launchpad.net lucid Release.gpg
Hit http://ppa.launchpad.net lucid Release.gpg
Hit http://ppa.launchpad.net lucid Release.gpg
Hit http://security.ubuntu.com lucid-security Release
Hit http://badgerports.org lucid Release.gpg
Hit http://archive.canonical.com lucid Release
Hit http://ppa.launchpad.net lucid Release.gpg
Hit http://ppa.launchpad.net maverick Release.gpg
Hit http://ppa.launchpad.net lucid Release.gpg
Hit http://ppa.launchpad.net lucid Release.gpg
Hit http://ppa.launchpad.net lucid Release.gpg
Get:2 http://dl.google.com stable Release [1347B]
Hit http://security.ubuntu.com lucid-security/main Packages
Hit http://ppa.launchpad.net lucid Release
Hit http://ppa.launchpad.net lucid Release
Hit http://packages.medibuntu.org lucid Release
Hit http://download.virtualbox.org lucid Release.gpg
Hit http://archive.canonical.com lucid Release
Hit http://linux.dropbox.com lucid Release.gpg
Get:3 http://dl.google.com stable/main Packages [1110B]
Hit http://security.ubuntu.com lucid-security/restricted Packages
Hit http://security.ubuntu.com lucid-security/main Sources
Hit http://security.ubuntu.com lucid-security/restricted Sources
Hit http://security.ubuntu.com lucid-security/universe Packages
Hit http://security.ubuntu.com lucid-security/universe Sources
Hit http://ppa.launchpad.net lucid Release
Hit http://ppa.launchpad.net lucid Release
Hit http://ppa.launchpad.net maverick Release
Hit http://ppa.launchpad.net lucid Release
Hit http://ppa.launchpad.net lucid Release
Hit http://badgerports.org lucid Release
Hit http://archive.canonical.com lucid/partner Packages
Hit http://security.ubuntu.com lucid-security/multiverse Packages
Hit http://security.ubuntu.com lucid-security/multiverse Sources
Hit http://ppa.launchpad.net lucid Release
Hit http://packages.medibuntu.org lucid/free Packages
Hit http://download.virtualbox.org lucid Release
Hit http://es.archive.ubuntu.com lucid Release.gpg
Hit http://linux.dropbox.com lucid Release
Hit http://archive.canonical.com lucid/partner Packages
Hit http://ppa.launchpad.net lucid/main Packages
Hit http://ppa.launchpad.net lucid/main Packages
Hit http://es.archive.ubuntu.com lucid-updates Release.gpg
Hit http://badgerports.org lucid/main Packages
Hit http://ppa.launchpad.net lucid/main Packages
Hit http://ppa.launchpad.net lucid/main Packages
Hit http://ppa.launchpad.net maverick/main Packages
Hit http://ppa.launchpad.net lucid/main Packages
Hit http://ppa.launchpad.net lucid/main Packages
Hit http://packages.medibuntu.org lucid/non-free Packages
Hit http://linux.dropbox.com lucid/main Packages
Hit http://es.archive.ubuntu.com lucid Release
Hit http://download.virtualbox.org lucid/contrib Packages
Hit http://ppa.launchpad.net lucid/main Packages
Hit http://es.archive.ubuntu.com lucid-updates Release
Hit http://es.archive.ubuntu.com lucid/main Packages
Hit http://es.archive.ubuntu.com lucid/restricted Packages
Hit http://es.archive.ubuntu.com lucid/main Sources
Hit http://es.archive.ubuntu.com lucid/restricted Sources
Hit http://es.archive.ubuntu.com lucid/universe Packages
Hit http://es.archive.ubuntu.com lucid/universe Sources
Hit http://es.archive.ubuntu.com lucid/multiverse Packages
Hit http://es.archive.ubuntu.com lucid/multiverse Sources
Hit http://es.archive.ubuntu.com lucid-updates/main Packages
Hit http://es.archive.ubuntu.com lucid-updates/restricted Packages
Hit http://es.archive.ubuntu.com lucid-updates/main Sources
Hit http://es.archive.ubuntu.com lucid-updates/restricted Sources
Hit http://es.archive.ubuntu.com lucid-updates/universe Packages
Hit http://es.archive.ubuntu.com lucid-updates/universe Sources
Hit http://es.archive.ubuntu.com lucid-updates/multiverse Packages
Hit http://es.archive.ubuntu.com lucid-updates/multiverse Sources
Fetched 2654B in 1s (1628B/s)
Reading package lists...
Reading package lists...
Building dependency tree...
Reading state information...
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.

ข้อผิดพลาดของฉันมาจากบันทึกงาน cron ที่ส่งถึงฉัน ฉันใช้ 10.04 เหมือนกับคุณ แปลก ..
djeikyb

ต้องเป็นไฟล์กำหนดค่า cron บางอย่างที่ตั้งค่า PATH ที่เข้มงวด ... ฉันไม่มีปัญหาในตอนนี้
luri
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.