@reboot ของ crontab ใช้งานได้กับรูทเท่านั้นหรือ


64

man 5 crontab ค่อนข้างชัดเจนในการใช้ crontab เพื่อเรียกใช้สคริปต์ในการบูต:

   These special time specification "nicknames" are supported, which replace the 5 initial time and date
   fields, and are prefixed by the `@` character:
   @reboot    :    Run once after reboot.

ดังนั้นฉันจึงเพิ่มบรรทัดเดียวใน crontab ของฉัน (ภายใต้บัญชีผู้ใช้ของฉันไม่ใช่รูท):

@reboot     /home/me/myscript.sh

แต่ด้วยเหตุผลบางอย่าง myscript.sh จะไม่ทำงานในการรีบูตเครื่อง (ทำงานได้ดีถ้าฉันเรียกใช้จากบรรทัดคำสั่งดังนั้นจึงไม่ใช่ปัญหาสิทธิ์)

ฉันพลาดอะไรไป


อัปเดตเพื่อตอบคำถามของ @ Anthon:

  1. เวอร์ชันของ Oracle-linux: 5.8 (uname: 2.6.32-300.39.2.el5uek # 1 SMP)
  2. เวอร์ชัน Cron: vixie-cron-4.1-81.el5.x86_64
  3. ใช่/home เป็นพาร์ติชันที่เมาท์ ดูเหมือนว่าปัญหานี้จะเกิดขึ้น ฉันจะแก้ไขปัญหานี้ได้อย่างไร
  4. ปัจจุบันmyscript.shเท่านั้น Echos /home/meข้อความไปยังไฟล์ใน

2
ผู้ใช้ crontab ของคุณไม่สนับสนุนตัวเลือก @reboot มีเลย์เอาต์ crontab สองสามอันเมื่อคุณเริ่มใช้งาน
X Tian

@ XTian ขอบคุณ วิธีที่แนะนำในการเรียกใช้สคริปต์เมื่อรีบูตในฐานะผู้ใช้อื่นนอกเหนือจากรูทคืออะไร
ระงับ

2
สิ่งที่คุณหายไปนั้นไม่ชัดเจน แต่สิ่งที่เราขาดหายไปคือรายละเอียด oracle-linux เวอร์ชั่นใดที่คุณใช้อยู่ คุณมีรุ่น cron รุ่นใดบ้าง เป็น/homeพาร์ทิชันที่ติดตั้ง? เนื้อหาของคุณ/home/me/myscript.shคืออะไร?
Anthon

1
หากคุณใช้งาน Oracle's Lin เวอร์ชั่น 5 มีการเปลี่ยนแปลงเกี่ยวกับปัญหาเกี่ยวกับ Vixie-cron @reboot+ oss.oracle.com/pipermail/el-errata/2012-March/002655.html
slm

1
@Daniel - myscript.shปฏิบัติการได้หรือไม่ chmod +x myscript.sh.
slm

คำตอบ:


47

นี่อาจเป็นหัวข้อที่สับสนเพราะมีการใช้งาน cron ที่แตกต่างกัน นอกจากนี้ยังมีข้อบกพร่องหลายอย่างที่ทำให้คุณสมบัตินี้เสียหายและมีบางกรณีการใช้งานที่ไม่สามารถใช้งานได้โดยเฉพาะถ้าคุณทำการปิดระบบ / บูตเทียบกับการรีบูต

เป็นโรคจิต

datapoint # 1

หนึ่งในข้อผิดพลาดดังกล่าวใน Debian ถูกปกคลุมที่นี่หัวข้อ: cron: งาน @reboot จะไม่ทำงาน ดูเหมือนว่ามันจะทำให้มันเป็นทางของ Ubuntu เช่นกันซึ่งฉันไม่สามารถยืนยันได้โดยตรง

datapoint # 2

หลักฐานของข้อผิดพลาดใน Ubuntu ดูเหมือนจะได้รับการยืนยันที่นี่ในคำถามและคำตอบ SO เรื่องนี้: @reboot cronjob ไม่ได้ทำงาน

สิ่งที่สกัดมา

ความคิดเห็น # 1: .... 3) crond เวอร์ชันของคุณอาจไม่รองรับ @reboot คุณใช้ crond ของ vix หรือไม่? ... แสดงผลลัพธ์ของผู้ใช้ crontab -l -u

ความคิดเห็น # 2: ... อาจเป็นความคิดที่ดีที่จะตั้งค่าเป็นสคริปต์เริ่มต้นแทนที่จะใช้ @reboot ของ cron รุ่นเฉพาะ

ความคิดเห็น # 3: ... @MarkRoberts ลบการรีบูตและแก้ไข 1 * * * * เป็น * / 1 * * * * * แก้ไขปัญหา! ฉันจะส่งตัวแทนแต้มมาร์คได้ที่ไหน ขอขอบคุณ!

คำตอบที่ได้รับการยอมรับใน Q&A นั้นก็มีความคิดเห็นนี้เช่นกัน:

ดูเหมือนว่าฉัน Lubuntu ไม่สนับสนุนไวยากรณ์ @Reboot Cron

หลักฐานเพิ่มเติม

datapoint # 3

ในฐานะที่เป็นหลักฐานเพิ่มเติมมีเธรดนี้ว่ามีคนพยายามทำสิ่งเดียวกันและรู้สึกผิดหวังที่ไม่ได้ผล มันชื่อ: กระทู้: Cron - งาน @reboot ไม่ทำงาน

สิ่งที่สกัดมา

Re: Cron - @reboot งานไม่ทำงาน

อ้างอิงโพสต้นฉบับโดย Ceallred ดูโพสต์นี่คือการฆ่าฉัน ... พยายามสคริปต์ wrapper การรันจะสร้างไฟล์บันทึกด้วยตนเอง ... กำลังรีบูตและงานไม่ทำงานหรือสร้างไฟล์บันทึก

Syslog แสดงให้เห็นว่า CRON ทำงาน ... แต่อีกครั้งไม่มีเอาต์พุตและกระบวนการไม่ทำงาน 15 Jul 20:07:45 RavenWing cron [1026]: (CRON) INFO (กำลังทำงาน @reboot jobs) Jul 15 20:07:45 RavenWing CRON [1053]: (ceallred) CMD (/ home / ceallred / สคริปต์ / run_spideroak sh> /home/ceallred/Scripts/SpiderOak.log 2> & 1 &)

ดูเหมือนว่า cron จะไม่ชอบคำสั่ง @reboot .... มีความคิดเห็นอื่นอีกไหม?

โอเค ... แก้ไขแล้วบางส่วน ฉันจะทำเครื่องหมายว่าแก้ไขแล้วและเริ่มหัวข้อใหม่ด้วยปัญหาใหม่ .....

ฉันคิดว่าคำตอบคือไดเรกทอรีบ้านที่เข้ารหัสของฉันไม่ได้ถูกเมาท์เมื่อ CRON พยายามเรียกใช้สคริปต์ (เก็บไว้ใน / home / ชื่อผู้ใช้ / สคริปต์) ย้ายไปที่ / usr / สคริปต์และงานรันตามที่คาดไว้

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

ขอบคุณสำหรับความช่วยเหลือ!

เมื่อผู้ใช้รายนี้พบปัญหาของเขาแล้วเขาสามารถ@rebootทำงานจากรายการ crontab ของผู้ใช้ได้

ฉันไม่แน่ใจว่า cron รุ่นใดที่ใช้กับ Ubuntu แต่ดูเหมือนจะบ่งบอกว่าผู้ใช้สามารถใช้งานได้@rebootเช่นกันหรือข้อผิดพลาดได้รับการแก้ไข ณ จุดหนึ่งใน cron รุ่นถัดไป

datapoint # 4

ฉันทดสอบบน CentOS 6 ต่อไปนี้และใช้งานได้

ตัวอย่าง

$ crontab -l
@reboot echo "hi" > /home/sam/reboot.txt 2>&1

จากนั้นฉันจะรีบูทระบบ

$ sudo reboot

หลังจากรีบูท

$ cat reboot.txt 
hi

ใช้สิ่งที่ได้

  1. ดูเหมือนว่าคุณสมบัตินี้จะรองรับทั้งระบบและรายการผู้ใช้ crontab
  2. คุณต้องตรวจสอบให้แน่ใจว่ารองรับ / ทำงานใน distro และ / หรือแพ็คเกจ cron ของคุณโดยเฉพาะ

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีการที่กลไกการทำงานจริงสำหรับ@rebootฉันได้เจอโพสต์บล็อกนี้ซึ่งกล่าวถึงอวัยวะภายใน มันชื่อ: @reboot - อธิบายมายากล

การดีบัก crond

คุณสามารถเพิ่มรายละเอียดของcrondการเพิ่มต่อไปนี้ลงในไฟล์การกำหนดค่าบน RHEL / CentOS / Fedora

$ more crond 
# Settings for the CRON daemon.
# CRONDARGS= :  any extra command-line startup arguments for crond
CRONDARGS="-L 2"

ระดับที่ถูกต้องคือ 0, 1 หรือ 2 ในการย้อนกลับไฟล์นี้กลับไปเป็นระดับการบันทึกเริ่มต้นเพียงแค่ลบ"-L 2"เมื่อคุณทำการดีบั๊กสถานการณ์แล้ว


มีความคิดเห็นเมื่อวานนี้ดูคำตอบของคุณและตัดสินใจที่จะตอบตัวเองหลังจากนอนหลับฝันดี ตั้งค่า VM ลองใหม่อีกครั้ง @reboot ต้องการโพสต์คำตอบของฉันแล้วเห็นคุณ 'reworded' คำตอบของคุณ :-(
Anthon

@ แอนทอน - ขอโทษฉันตอบอย่างรวดเร็วเมื่อวานนี้จากนั้นทำการวิจัยต่อไปและพบรายละเอียดที่ขัดแย้งกันมาก เมื่อฉันพบข้อผิดพลาดเกี่ยวกับ Debian เกี่ยวกับเรื่องนี้และ Ubuntu ดังนั้นฉันจึงรู้ว่ามีอะไรเกิดขึ้นบ้าง ฉันเห็นว่ามันใช้งานได้กับ CentOS และรวมเข้าด้วยกันซึ่ง@rebootก็โอเคในบาง crons และเห็นได้ชัดว่าเป็นรถ / แตกในคนอื่น ๆ ดังนั้นความสับสน
slm

นอกเหนือจากนั้น OP ยังให้รายละเอียดเล็ก ๆ น้อย ๆ คุณสามารถใช้บางอย่างที่ไม่ทำงาน (ตอนบูต) ในสคริปต์ของคุณที่ทำให้มันล้มเหลวหรืออยู่ในดิสก์ที่ยังไม่ได้ติดตั้ง คำตอบของฉันที่ OP แสดงความคิดเห็นได้รับการยืนยันโดยบุคคลที่สามเช่นกัน มันเป็นปัญหาหงส์ดำ ...
Anthon

@ อันธพาล - ใช่หนึ่งในดาต้าพอยท์ของฉันเป็นแบบนั้น @rebootทำงานได้เมื่อคุณตระหนักว่ากำลังพยายามเข้าถึงไดรฟ์ที่เข้ารหัสซึ่งยังไม่ได้ติดตั้ง
slm

3
@reboot sleep 60; <your command>คุณอาจต้องการที่จะชี้ให้เห็นว่าข้อผิดพลาดในอูบุนตูจะแก้ไขได้อย่างง่ายดายโดยการเพิ่มความล่าช้า: เพื่ออ้างถึงหัวข้อ "ฉันเดาว่าคำสั่ง @reboot ของ cron ทำงานเร็วเกินไปในกระบวนการบู๊ต"
pzkpfw

12

ฉันพบว่าในเครื่อง Ubuntu ของฉันฉันไม่สามารถเข้าถึงบริการ dns ได้ในเวลา @reboot สิ่งนี้ทำให้ฉันไม่สามารถติดตั้งไดรฟ์ข้อมูลระยะไกลได้ วิธีการแก้ปัญหาที่ซ้ำซาก แต่เรียบง่ายนี้ใช้งานได้:

@reboot sleep 60 && /home/me/bin/mount.sh 2>&1 >> /home/me/reboot.log

(ใน root cron ส่วนสุดท้ายสำหรับการดีบักเท่านั้น)


นี่เป็นสิ่งเดียวที่ใช้งานได้จริงบน Ubuntu 16.04 สำหรับผู้ใช้ที่ไม่ใช่รูท!
Aleksandar Pavić

ไม่ทำงานกับ Debian 8 jessie (คำพังเพย 3) :(
Tadej

สิ่งนี้ใช้ได้สำหรับฉันเมื่อต้องรับมือกับการติดตั้ง VMWare โฟลเดอร์ที่แชร์ไปยังตำแหน่งอื่น
jgshawkey

3

ฉันมี mac osx เช่นกันและฉันก็มีปัญหาเดียวกันกับที่สคริปต์ของฉันไม่ได้ทำงาน แต่เมื่อฉันคงสคริปต์ของฉันชอบ

@reboot   cd /home/me/  && sh myscript.sh

มันทำงานได้ดีสำหรับฉัน ตรวจสอบให้แน่ใจว่าไฟล์เชลล์ของคุณสามารถเรียกใช้งานได้โดยการรันคำสั่ง

chmod +x myscript.sh

2

ฉันไม่ทราบว่าคุณได้แก้ไขปัญหานี้ไปแล้วหรือหากข้อใดข้อหนึ่งข้างต้นเป็นโซลูชันที่คุณต้องการ แต่มีความเป็นไปได้อีกอย่างคือ:

หากคุณมีการเข้ารหัส / โฮมไดเรกทอรีของคุณมันอาจไม่สามารถใช้ได้จนกว่าคุณจะเข้าสู่ระบบนั่นคือมันจะไม่สามารถใช้ได้เมื่อรีบูต

ในสถานการณ์นี้คุณสามารถย้ายสคริปต์ของคุณไปยังตำแหน่งอื่นเช่น / srv หรือ / opt หรือ / usr / local / bin / ฯลฯ


1

ติดตั้ง Ubuntu Gnome 13.10 ใหม่ (ผู้ใช้เริ่มต้นในกรณีของฉัน: avanderneut)

avanderneut@uggo:~$ crontab -l
no crontab for avanderneut
avanderneut@uggo:~$ crontab -e
no crontab for avanderneut - using an empty one

Select an editor.  To change later, run 'select-editor'.
  1. /bin/ed
  2. /bin/nano        <---- easiest
  3. /usr/bin/vim.tiny

Choose 1-3 [2]: 3
crontab: installing new crontab
avanderneut@uggo:~$ crontab -l | tail -2
# m h  dom mon dow   command
@reboot /home/avanderneut/bin/on_reboot
avanderneut@uggo:~$ vi /home/avanderneut/bin/on_reboot
avanderneut@uggo:~$ more !$
more /home/avanderneut/bin/on_reboot
#! /bin/bash
echo "Reboot script" > /var/tmp/xxx
avanderneut@uggo:~$ chmod 755 /home/avanderneut/bin/on_reboot
avanderneut@uggo:~$ ls /var/tmp
avanderneut@uggo:~$ /home/avanderneut/bin/on_reboot
avanderneut@uggo:~$ ls /var/tmp
xxx
avanderneut@uggo:~$ rm /var/tmp/xxx
avanderneut@uggo:~$ sudo reboot
[sudo] password for avanderneut: 

และดูว่าหลังจากรีบูตไฟล์/var/tmp/xxxจะอยู่ที่นั่นแม้ว่าจะไม่ได้อยู่ที่นั่นก่อนทำการรีบูต

สิ่งนี้ทำกับ cron เวอร์ชัน 3.0

คุณต้องตรวจสอบให้แน่ใจว่าไม่มีบริการดิสก์ ฯลฯ ถูกใช้ซึ่งอาจไม่สามารถใช้ได้ในขณะที่สคริปต์ทำงาน เริ่มต้นด้วยสิ่งที่ง่ายเหมือนข้างต้นและตรวจสอบให้แน่ใจว่าไม่มีผลลัพธ์ของเทอร์มินัลเนื่องจากอีเมลอาจไม่ทำงาน

คุณอาจต้องการ cron ที่ทันสมัยมากขึ้น (หรืออัพเกรดจาก oracle-linux) หากสิ่งนี้ไม่ได้ผลสำหรับคุณและคุณต้องการคุณสมบัตินี้


ฉันอัปเดต OP เพื่อตอบคำถามของคุณ เปลี่ยนความสงสัยของคุณให้ถูกต้องตั้งแต่เริ่มต้น: สคริปต์ที่ต้องทำงานเมื่อรีบูตอยู่ใน/dev/mapper/VolGroup00-LogVol01พาร์ติชันที่เมาท์ได้
ระงับ

@Daniel ขอบคุณที่แจ้งให้เราทราบฉันดีใจที่คุณพบผู้กระทำผิด ฉันไม่แน่ใจว่าคุณสามารถหน่วงเวลาการเริ่มการทำงานของ cron ได้หรือไม่จนกว่าพาร์ติชั่นจะถูกเมานต์การเริ่มต้นบางอย่างนั้นทำในแบบขนานและคุณจะต้องเปลี่ยนการพึ่งพา cronฉันไม่อยากจะยุ่งกับที่และแบ่งไปได้ คุณควร IMHO ใช้เส้นทางที่แตกต่างจาก crontab & @reboot เพื่อเรียกใช้บางสิ่งเมื่อเริ่มต้นในฐานะผู้ใช้
Anthon

0

ฉันจะตอบว่าใช่สำหรับคำถาม เพิ่งมีปัญหากับการรัน cron ในการรีบูท (Debian 3.10.70) และจัดการแก้ไขด้วย:

@reboot root /usr/bin/python3 /path/to/script

และอักขระขึ้นบรรทัดใหม่ '\ n'ในที่สุด

นี่คือเนื้อหาของไฟล์:

/etc/cron.d/runOnReboot

ในที่สุดฉันคิดว่ามันคุ้มค่าที่จะเห็นนามธรรมจาก man 5 crontab

... รูปแบบของคำสั่ง cron นั้นเป็นมาตรฐาน V7 ที่มีนามสกุลที่เข้ากันได้จำนวนมาก แต่ละบรรทัดมีห้าฟิลด์และวันที่ตามด้วยคำสั่งตามด้วยอักขระขึ้นบรรทัดใหม่ ('\ n') ระบบ crontab (/ etc / crontab) ใช้รูปแบบเดียวกันยกเว้นว่าระบุชื่อผู้ใช้สำหรับคำสั่งหลังจากฟิลด์เวลาและวันที่และก่อนคำสั่ง เขตข้อมูลอาจคั่นด้วยช่องว่างหรือแท็บ ความยาวสูงสุดที่อนุญาตสำหรับฟิลด์คำสั่งคือ 998 ตัวอักษร ...


0

ก่อนอื่นคุณควรเข้าสู่ระบบด้วย root:

sudo -i

จากนั้นเปิด crontab:

crontab -e

หลังจากนั้นเพิ่มสคริปต์ของคุณไปที่ crontab ตามรูทดังนี้:

@reboot root / home / user1 / Desktop / my_script

ดังนั้นฉันเห็นว่าสคริปต์ของฉันทำงานถูกต้อง

หมายเหตุ: หากคุณแก้ไข crontab ด้วยผู้ใช้ปัจจุบันของคุณการรีบูตไม่สามารถเรียกสคริปต์ของคุณได้อย่างถูกต้อง


-1

prueba:

usuario @ ubuntu: ~ $ touch script.sh usuario @ ubuntu: ~ $ chmod + x script.sh

usuario @ ubuntu: ~ $ $ crontrab -e

@reboot /home/usuario/script.sh

บันทึกและรีสตาร์ทพีซีของคุณ

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