@reboot của crontab chỉ hoạt động cho root?


64

man 5 crontab khá rõ ràng về cách sử dụng crontab để chạy tập lệnh khi khởi động:

   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.

Vì vậy, tôi vui vẻ thêm một dòng vào crontab của mình (trong tài khoản người dùng của tôi, không phải root):

@reboot     /home/me/myscript.sh

Nhưng vì một số lý do, myscript.sh sẽ không chạy trên máy khởi động lại. (nó chạy tốt nếu tôi gọi nó từ dòng lệnh, vì vậy nó không phải là vấn đề về quyền)

Tôi đang thiếu gì?


Cập nhật để trả lời câu hỏi của @ Anthon:

  1. Phiên bản Oracle-linux: 5,8 (uname: 2.6.32-300.39.2.el5uek # 1 SMP)
  2. Phiên bản cron: vixie-cron-4.1-81.el5.x86_64
  3. Có, /home một phân vùng gắn kết. Có vẻ như đây là vấn đề. Làm thế nào để tôi giải quyết vấn đề này?
  4. Hiện tại, myscript.shchỉ có một tin nhắn văn bản đến một tập tin /home/me.

2
crontab người dùng của bạn không hỗ trợ tùy chọn @reboot, có một vài bố cục crontab, khi bạn bắt đầu chọc ngoáy.
X Tian

@XTian Cảm ơn. Cách được đề xuất để chạy tập lệnh khi khởi động lại với tư cách người dùng không phải là root?
Giữ lại

2
Những gì bạn đang thiếu là không rõ ràng, nhưng những gì chúng tôi đang thiếu là chi tiết. Phiên bản oracle-linux nào bạn đang chạy? Bạn có phiên bản nào của cron? Là /homemột phân vùng gắn kết? Nội dung của bạn là /home/me/myscript.shgì?
Anthon

1
Nếu bạn đang sử dụng Lin của Oracle. ver. 5 có sự thay đổi này về các vấn đề với vixie-cron + @reboot. oss.oracle.com/pipermail/el-errata/2012-March/002655.html
slm

1
@Daniel - là myscript.shthực thi? chmod +x myscript.sh.
slm

Câu trả lời:


47

Đây có thể là một chút của một chủ đề khó hiểu bởi vì có các triển khai khác nhau của cron. Ngoài ra, có một số lỗi đã phá vỡ tính năng này và cũng có một số trường hợp sử dụng mà đơn giản là nó không hoạt động, đặc biệt nếu bạn thực hiện tắt máy / khởi động so với khởi động lại.

Lỗi

bảng dữ liệu số 1

Một lỗi như vậy trong Debian được đề cập ở đây, có tiêu đề: cron: @reboot jobs không được chạy . Điều này dường như cũng đã được đưa vào Ubuntu, điều mà tôi không thể xác nhận trực tiếp.

bảng dữ liệu số 2

Bằng chứng về lỗi trong Ubuntu dường như sẽ được xác nhận ở đây trong phần Hỏi & Đáp SO này có tiêu đề: @reboot cronjob không thực thi .

đoạn trích

nhận xét # 1: .... 3) phiên bản crond của bạn có thể không hỗ trợ @reboot bạn có đang sử dụng crond của vix không? ... Hiển thị kết quả của người dùng crontab -l -u

bình luận # 2: ... Có thể là một ý tưởng tốt để thiết lập nó dưới dạng một tập lệnh init thay vì dựa vào một phiên bản cụ thể của cron's @reboot.

nhận xét # 3: ... @MarkRoberts đã xóa phần khởi động lại và sửa đổi 1 * * * *, thành * / 1 * * * *, vấn đề đã được giải quyết! Tôi gửi đại diện Mark ở đâu? Cảm ơn bạn!

Câu trả lời được chấp nhận trong đó Q & A cũng có nhận xét này:

Dường như với tôi, Lubfox không hỗ trợ cú pháp @Reboot Cron.

Bằng chứng bổ sung

bảng dữ liệu số 3

Như một bằng chứng bổ sung có chủ đề này cho thấy ai đó đang cố gắng làm điều tương tự và cảm thấy thất vọng vì nó không hoạt động. Nó có tiêu đề: Chủ đề: Cron - công việc @reboot không hoạt động .

đoạn trích

Re: Cron - @reboot công việc không hoạt động

Trích dẫn được đăng bởi ceallred Xem bài viết Điều này đang giết chết tôi ... Đã thử tập lệnh bao bọc. Chạy thủ công tạo tệp nhật ký ... khởi động lại và công việc không chạy hoặc tạo tệp nhật ký.

Syslog cho thấy CRON đã chạy công việc ... nhưng một lần nữa, không có đầu ra và quá trình không chạy. 15 tháng 7 20:07:45 RavenWing cron [1026]: (CRON) INFO (Chạy các công việc @reboot) 15 tháng 7 20:07:45 RavenWing CRON [1053]: (ceallred) sh> /home/ceallred/Scripts/SpiderOak.log 2> & 1 &)

Có vẻ như cron không thích lệnh @reboot .... Còn ý tưởng nào khác không?

Được rồi ... Giải quyết một phần. Tôi sẽ đánh dấu vấn đề này là đã giải quyết và bắt đầu một chủ đề mới với vấn đề mới .....

Tôi nghĩ rằng câu trả lời là thư mục nhà được mã hóa của tôi không được gắn kết khi CRON đang cố chạy tập lệnh (được lưu trong / home / tên người dùng / tập lệnh). Đã chuyển đến / usr / script và công việc chạy như mong đợi.

Vì vậy, bây giờ nó dường như là một vấn đề spideroak. Quá trình bắt đầu, nhưng đến khi quá trình khởi động kết thúc, nó đã biến mất. Tôi đoán một sự cố vì một số lý do .... Chủ đề mới để hỏi về điều đó.

Cảm ơn vì sự giúp đỡ!

Một khi người dùng ở trên phát hiện ra vấn đề của mình, anh ta đã có thể @rebootthoát khỏi mục nhập crontab của người dùng.

Tôi không hoàn toàn chắc chắn phiên bản cron nào được sử dụng trên Ubuntu, nhưng điều này dường như cho thấy rằng người dùng cũng có thể sử dụng @reboothoặc lỗi đã được sửa tại một số điểm trong các phiên bản tiếp theo của cron.

bảng dữ liệu số 4

Tôi đã thử nghiệm trên CentOS 6 như sau và nó đã hoạt động.

Thí dụ

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

Sau đó tôi khởi động lại hệ thống.

$ sudo reboot

Sau khi khởi động lại.

$ cat reboot.txt 
hi

Đi đường

  1. Tính năng này dường như được hỗ trợ cho cả mục nhập crontab của hệ thống và người dùng.
  2. Bạn phải đảm bảo rằng nó được hỗ trợ / hoạt động trong bản phân phối cụ thể và / hoặc phiên bản của gói cron.

Để biết thêm về cách thức hoạt động của cơ chế thực tế, @reboottôi đã xem qua bài đăng trên blog này để thảo luận về các bộ phận. Nó có tiêu đề: @reboot - giải thích ma thuật cron đơn giản .

Gỡ lỗi crond

Bạn có thể tăng mức độ chi tiết crondbằng cách thêm phần sau vào tệp cấu hình này trên các bản phân phối dựa trên RHEL / CentOS / Fedora.

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

Các mức hợp lệ là 0, 1 hoặc 2. Để hoàn nguyên tệp này về mức ghi nhật ký mặc định, chỉ cần xóa "-L 2"khi bạn hoàn tất việc gỡ lỗi tình huống.


Có một bình luận ngày hôm qua, nhìn vào câu trả lời của bạn và quyết định tự trả lời sau một giấc ngủ ngon. Thiết lập một VM, đã thử lại @reboot, muốn đăng câu trả lời của tôi và chỉ sau đó mới thấy bạn 'điều chỉnh lại' câu trả lời của bạn :-(
Anthon

@Anthon - xin lỗi, tôi đã nhanh chóng trả lời nó ngày hôm qua và sau đó tiếp tục nghiên cứu nó và tìm thấy những chi tiết rất mâu thuẫn. Khi tôi tìm thấy lỗi trên Debian về nó và Ubuntu SO, tôi nhận ra một số thứ đang chơi. Tôi thấy rằng nó hoạt động trên CentOS và kết hợp nó lại với nhau @reboottrong một số trường hợp nhất định, và rõ ràng là lỗi / hỏng ở những người khác. Do đó sự nhầm lẫn.
slm

Ngoài ra, OP cung cấp rất ít chi tiết, bạn có thể dễ dàng sử dụng một cái gì đó chưa hoạt động (lúc khởi động) trong tập lệnh của bạn khiến nó bị lỗi hoặc để nó nằm trên đĩa chưa được gắn. Câu trả lời của tôi mà OP nhận xét, cũng được xác nhận bởi bên thứ 3. Đó là vấn đề thiên nga đen ...
Anthon

@Anthon - vâng, một trong những datapoint của tôi chính xác là như vậy. @rebootđã hoạt động khi bạn nhận ra rằng nó đang cố truy cập vào một ổ đĩa được mã hóa, chưa được gắn kết.
slm

3
Bạn có thể muốn chỉ ra rằng lỗi trong Ubuntu có thể được giải quyết dễ dàng bằng cách thêm độ trễ : @reboot sleep 60; <your command>. Để trích dẫn chủ đề, "tôi đoán là chỉ thị @reboot của cron đang chạy quá sớm trong quá trình khởi động"
pzkpfw 19/2/2015

12

Tôi phát hiện ra rằng trên máy Ubuntu của mình, tôi chưa có quyền truy cập vào các dịch vụ dns, vào lúc @reboot. Điều này ngăn tôi gắn khối lượng từ xa. Giải pháp này, nhưng đơn giản, làm việc:

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

(trong cron gốc; phần cuối chỉ để gỡ lỗi)


Đây là điều duy nhất thực sự hoạt động trên Ubuntu 16.04 cho người dùng không root!
Aleksandar Pavić

Không hoạt động trên Debian 8 jessie (gnome 3). :(
Tadej

Điều này làm việc cho tôi khi xử lý việc gắn các thư mục chia sẻ VMWare vào một vị trí riêng biệt.
jgshawkey

3

Tôi cũng có mac osx và tôi gặp vấn đề tương tự khi tập lệnh của tôi không chạy. nhưng khi tôi sửa kịch bản của mình để thích

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

Nó làm việc tốt cho tôi. đảm bảo làm cho tệp shell của bạn có thể được thực thi bằng cách chạy lệnh

chmod +x myscript.sh

2

Tôi không biết nếu bạn đã giải quyết vấn đề này, hoặc nếu bất kỳ điều nào ở trên là giải pháp bạn cần, nhưng một khả năng khác là:

nếu bạn đã mã hóa thư mục / home của mình, nó có thể không khả dụng cho đến khi bạn đăng nhập, tức là nó không có sẵn khi khởi động lại.

trong trường hợp này, bạn có thể di chuyển tập lệnh của mình đến một vị trí khác như / srv hoặc / opt hoặc / usr / local / bin / v.v.


1

Hãy cài đặt Ubuntu Gnome 13.10 mới (người dùng mặc định trong trường hợp của tôi: 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: 

Và thấy rằng sau khi khởi động lại, tập tin /var/tmp/xxxsẽ ở đó mặc dù nó không ở đó trước khi khởi động lại.

Điều này đã được thực hiện với phiên bản cron 3.0.

Bạn phải đảm bảo rằng không có đĩa dịch vụ nào được sử dụng, v.v. có thể không có sẵn tại thời điểm tập lệnh chạy. Bắt đầu với một cái gì đó đơn giản như ở trên và đảm bảo rằng nó không có đầu ra đầu cuối vì email có thể không hoạt động.

Bạn cũng có thể cần một cron cập nhật hơn (hoặc nâng cấp từ oracle-linux) nếu điều này không hiệu quả với bạn và bạn cần tính năng này.


Tôi đã cập nhật OP của tôi để trả lời câu hỏi của bạn. Hóa ra sự nghi ngờ của bạn đã đúng ngay từ đầu: Kịch bản được chạy khi khởi động lại nằm trên một /dev/mapper/VolGroup00-LogVol01phân vùng có thể gắn kết .
Giữ lại

@Daniel Cảm ơn đã cho tôi biết, tôi rất vui vì bạn đã tìm ra thủ phạm. Tôi không chắc chắn nếu bạn có thể trì hoãn việc bắt đầu cron cho đến khi các phân vùng được gắn kết, một số khởi động đó được thực hiện song song và bạn sẽ phải thay đổi phụ thuộc. Tôi sẽ không muốn gây rối với điều đó và có thể phá vỡ cron. Bạn nên IMHO đi một tuyến đường khác với crontab & @reboot để chạy một cái gì đó khi khởi động với tư cách là người dùng.
Anthon

0

Tôi sẽ nói có cho câu hỏi. Chỉ gặp khó khăn với việc chạy cron khi khởi động lại (Debian 3.10,70) và đã giải quyết bằng:

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

Và một nhân vật dòng mới '\ n' cuối cùng

Đây là nội dung của tập tin:

/etc/cron.d/runOnReboot

Cuối cùng, tôi nghĩ rằng đáng chú ý là một bản tóm tắt từ man 5 crontab

... Định dạng của lệnh cron rất giống với tiêu chuẩn V7, với một số phần mở rộng tương thích hướng lên. Mỗi dòng có năm trường thời gian và ngày, theo sau là một lệnh, theo sau là một ký tự dòng mới ('\ n'). Hệ thống crontab (/ etc / crontab) sử dụng cùng định dạng, ngoại trừ tên người dùng cho lệnh được chỉ định sau các trường thời gian và ngày và trước lệnh. Các trường có thể được phân tách bằng dấu cách hoặc tab. Độ dài tối đa được phép cho trường lệnh là 998 ký tự. ...


0

Trước hết, bạn nên đăng nhập bằng root:

sudo -i

Sau đó mở crontab:

crontab -e

Sau đó, thêm tập lệnh của bạn vào crontab dưới dạng root như bên dưới:

@reboot root / home / user1 / Desktop / my_script

Kết quả là tôi thấy rằng kịch bản của tôi hoạt động đúng.

Lưu ý: Nếu bạn chỉnh sửa crontab với người dùng hiện tại của mình, việc khởi động lại không thể gọi đúng kịch bản của bạn.


-1

prueba:

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

usuario @ ubfox: ~ $ $ crontrab -e

@reboot /home/usuario/script.sh

lưu và khởi động lại máy tính của bạn

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.