@reboot crontab hanya berfungsi untuk root?

64

man 5 crontab cukup jelas tentang cara menggunakan crontab untuk menjalankan skrip saat boot:

   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.

Jadi saya dengan senang hati menambahkan satu baris ke crontab saya (di bawah akun pengguna saya, bukan root):

@reboot     /home/me/myscript.sh

Tetapi untuk beberapa alasan, myscript.sh tidak akan berjalan di mesin reboot. (Ini berjalan dengan baik jika saya memintanya dari baris perintah, jadi itu bukan masalah izin)

Apa yang saya lewatkan?


Pembaruan untuk menjawab pertanyaan @ Anthon:

  1. Versi Oracle-linux: 5.8 (tidak sama: 2.6.32-300.39.2.el5uek # 1 SMP)
  2. Versi Cron: vixie-cron-4.1-81.el5.x86_64
  3. Ya, /home adalah partisi yang dipasang. Sepertinya ini masalahnya. Bagaimana saya mengatasinya?
  4. Saat ini, myscript.shhanya gema pesan teks ke file di /home/me.
Dipotong
sumber
2
crontab pengguna Anda tidak mendukung opsi @reboot, ada beberapa tata letak crontab, setelah Anda mulai mencari-cari.
X Tian
@XTian Terima kasih. Apa cara yang disarankan untuk menjalankan skrip saat reboot sebagai pengguna selain root?
Dirahasiakan
2
Apa yang Anda lewatkan tidak jelas, tetapi yang kami lewatkan adalah detail. Versi oracle-linux apa yang Anda jalankan? Versi cron apa yang Anda miliki? Apakah /homepartisi yang dipasang? Apa isinya /home/me/myscript.sh?
Anthon
1
Jika Anda menggunakan Lin Oracle. ver. 5 ada changelog ini tentang masalah dengan vixie-cron + @reboot. oss.oracle.com/pipermail/el-errata/2012-March/002655.html
slm
1
@Aniel - dapat myscript.shdieksekusi? chmod +x myscript.sh.
slm

Jawaban:

47

Ini bisa menjadi topik yang membingungkan karena ada implementasi cron yang berbeda. Juga ada beberapa bug yang merusak fitur ini, dan ada juga beberapa kasus penggunaan di mana itu tidak akan berfungsi, khususnya jika Anda melakukan shutdown / boot vs reboot.

Bug

datapoint # 1

Salah satu bug di Debian dibahas di sini, berjudul: cron: @reboot jobs tidak dijalankan . Ini sepertinya telah masuk ke Ubuntu juga, yang saya tidak dapat konfirmasi secara langsung.

datapoint # 2

Bukti bug di Ubuntu tampaknya akan dikonfirmasi di sini dalam SO T&J ini berjudul: @reboot cronjob tidak dijalankan .

kutipan

komentar # 1: .... 3) versi crond Anda mungkin tidak mendukung @reboot apakah Anda menggunakan crx vix? ... tampilkan hasil dari crontab -l -u pengguna

komentar # 2: ... Mungkin ide yang baik untuk mengaturnya sebagai skrip init alih-alih mengandalkan versi tertentu dari @reboot cron.

comment # 3: ... @MarkRoberts menghapus reboot dan memodifikasi 1 * * * *, menjadi * / 1 * * * *, masalah terpecahkan! Di mana saya mengirim Mark Poin repts? Terima kasih!

Jawaban yang diterima dalam Tanya Jawab itu juga memiliki komentar ini:

Menurut saya Lubuntu tidak mendukung sintaks @Reboot Cron.

Bukti tambahan

datapoint # 3

Sebagai bukti tambahan ada utas ini bahwa seseorang mencoba hal yang sama dan merasa frustrasi karena tidak berhasil. Judulnya: Thread: Cron - @reboot jobs tidak berfungsi .

kutipan

Re: Cron - pekerjaan @reboot tidak berfungsi

Kutip Awalnya Diposting oleh ceallred Lihat Posting Ini membunuhku ... Mencoba skrip wrapper. Menjalankan secara manual menghasilkan file log ... me-reboot dan pekerjaan tidak berjalan atau membuat file log.

Syslog menunjukkan bahwa CRON menjalankan pekerjaan ... tetapi sekali lagi, tidak ada output dan proses tidak berjalan. 15 Jul 20:07:45 RavenWing cron [1026]: (CRON) INFO (Menjalankan pekerjaan @ reboot) 15 Jul 20:07:45 RavenWing CRON [1053]: (ceallred) CMD (/ home / ceallred / Scripts / run_spideroak. sh> /home/ceallred/Scripts/SpiderOak.log 2> & 1 &)

Sepertinya cron tidak menyukai perintah @reboot .... Ada ide lain?

Oke ... Sebagian terpecahkan. Saya akan menandai yang ini diselesaikan dan memulai utas baru dengan masalah baru .....

Saya pikir jawabannya adalah direktori home terenkripsi saya tidak dipasang ketika CRON mencoba menjalankan skrip (disimpan di / home / nama pengguna / skrip). Pindah ke / usr / skrip dan pekerjaan berjalan seperti yang diharapkan.

Jadi sekarang tampaknya menjadi masalah spideroak. Proses dimulai, tetapi pada saat proses booting selesai, proses itu hilang. Saya menduga crash karena suatu alasan .... Utas baru untuk bertanya tentang itu.

Terima kasih atas semua bantuannya!

Setelah pengguna di atas menemukan masalahnya, ia bisa mulai @rebootmengerjakan entri crontab pengguna.

Saya tidak sepenuhnya yakin versi cron apa yang digunakan di Ubuntu, tetapi ini sepertinya mengindikasikan bahwa pengguna juga dapat menggunakannya @reboot, atau bahwa bug diperbaiki pada beberapa titik di versi cron berikutnya.

datapoint # 4

Saya menguji pada CentOS 6 berikut ini dan itu berhasil.

Contoh

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

Saya kemudian reboot sistem.

$ sudo reboot

Setelah reboot.

$ cat reboot.txt 
hi

Awasi

  1. Fitur ini tampaknya didukung untuk entri sistem dan crontab pengguna.
  2. Anda harus memastikan bahwa itu didukung / bekerja di distro khusus Anda dan / atau versi paket cron.

Untuk lebih lanjut tentang bagaimana mekanisme yang sebenarnya bekerja untuk @rebootsaya menemukan posting blog ini yang membahas jeroan. Judulnya : @reboot - menjelaskan sihir cron sederhana .

Debugging crond

Anda dapat mengubah verbositas cronddengan menambahkan yang berikut ini ke file konfigurasi ini di distro berbasis RHEL / CentOS / Fedora.

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

Level yang valid adalah 0, 1, atau 2. Untuk mengembalikan file ini kembali ke level logging standarnya, cukup hapus "-L 2"ketika Anda selesai men-debug situasi.

slm
sumber
Mendapat komentar kemarin, melihat jawaban Anda dan memutuskan untuk menjawab sendiri setelah tidur nyenyak. Siapkan VM, coba kembali @reboot, ingin memposting jawaban saya dan baru kemudian melihat Anda 'menulis ulang' jawaban Anda :-(
Anthon
@Anthon - maaf, saya dengan cepat menjawabnya kemarin dan kemudian melanjutkan penelitian dan menemukan detail yang sangat bertentangan. Ketika saya menemukan bug di Debian tentang hal itu dan Ubuntu SO saya menyadari beberapa hal yang sedang terjadi. Saya melihat bahwa itu bekerja pada CentOS dan menempatkannya bersama yang @rebootOK di crons tertentu, dan tampaknya buggy / rusak pada yang lain. Karena itu kebingungan.
slm
Selain itu OP memberikan sedikit detail, Anda dapat dengan mudah menggunakan sesuatu yang belum berfungsi (saat boot) di skrip Anda yang membuatnya gagal, atau menyimpannya di disk yang belum dipasang. Jawaban saya yang dikomentari OP, juga dikonfirmasi oleh pihak ke-3. Ini adalah masalah angsa hitam ...
Anthon
@Anthon - ya salah satu datapoint saya persis seperti itu. @rebootberfungsi setelah Anda menyadari sedang mencoba mengakses drive yang dienkripsi, yang belum dipasang pada saat itu.
slm
3
Anda mungkin ingin menunjukkan bahwa bug di Ubuntu mudah dipecahkan dengan menambahkan penundaan: @reboot sleep 60; <your command>. Mengutip utas, "tebakan saya adalah bahwa arahan @reboot cron berjalan terlalu dini dalam proses boot"
pzkpfw
12

Saya mengetahui bahwa pada mesin Ubuntu saya, saya belum memiliki akses ke layanan dns, pada waktu @reboot. Ini mencegah saya memasang volume jarak jauh. Solusi klise ini, namun sederhana, bekerja:

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

(di root cron; bagian terakhir hanya untuk debugging)

André
sumber
Ini adalah satu-satunya hal yang benar-benar berfungsi di ubuntu 16.04 untuk pengguna non-root!
Aleksandar Pavić
Tidak bekerja pada Debian 8 jessie (gnome 3). :(
Tadej
Ini bekerja untuk saya ketika berhadapan dengan pemasangan folder bersama VMWare ke lokasi terpisah.
jgshawkey
3

Saya memiliki mac osx juga dan saya memiliki masalah yang sama di mana skrip saya tidak berjalan. tetapi ketika saya memperbaiki skrip saya suka

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

ini bekerja dengan baik untukku. pastikan untuk membuat file shell Anda dapat dieksekusi dengan menjalankan perintah

chmod +x myscript.sh
Kidane
sumber
2

Saya tidak tahu apakah Anda sudah menyelesaikan ini, atau apakah salah satu di atas adalah solusi yang Anda butuhkan, tetapi kemungkinan lain adalah:

jika Anda memiliki direktori / home Anda terenkripsi, itu mungkin tidak tersedia sampai Anda masuk, artinya tidak tersedia saat reboot.

dalam skenario ini, Anda dapat memindahkan skrip Anda ke lokasi lain seperti / srv atau / opt atau / usr / local / bin / dll.

fbas
sumber
1

Lakukan instalasi baru Ubuntu Gnome 13.10 (pengguna default dalam kasus saya: 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: 

Dan lihat bahwa setelah reboot file /var/tmp/xxxada di sana walaupun tidak ada sebelum reboot.

Ini dilakukan dengan cron versi 3.0.

Anda harus memastikan bahwa tidak ada disk layanan dll yang digunakan yang mungkin tidak tersedia pada saat skrip berjalan. Mulailah dengan sesuatu yang sederhana seperti di atas dan pastikan tidak memiliki keluaran terminal karena email mungkin tidak aktif dan berjalan.

Anda mungkin juga membutuhkan cron yang lebih baru (atau upgrade dari oracle-linux) jika ini tidak berhasil untuk Anda dan Anda memerlukan fitur ini.

Anthon
sumber
Saya memperbarui OP saya untuk menjawab pertanyaan Anda. Ternyata kecurigaan Anda benar sejak awal: Skrip yang harus dijalankan saat reboot berada di /dev/mapper/VolGroup00-LogVol01partisi yang dapat dipasang .
Dirahasiakan
@Daniel Terima kasih telah memberi tahu saya, saya senang Anda menemukan pelakunya. Saya tidak yakin apakah Anda dapat menunda dimulainya cron sampai partisi dipasang, beberapa startup yang dilakukan secara paralel dan Anda harus mengubah dependensi. Saya tidak ingin mengacaukannya dan kemungkinan istirahat cron. Anda harus IMHO mengambil rute yang berbeda dari crontab & @reboot untuk menjalankan sesuatu sekali saat startup sebagai pengguna.
Anthon
0

Saya akan menjawab ya untuk pertanyaan itu. Baru saja mengalami kesulitan dengan menjalankan cron di reboot (Debian 3.10.70) dan berhasil diselesaikan dengan:

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

Dan karakter baris baru '\ n' pada akhirnya

Ini adalah isi file:

/etc/cron.d/runOnReboot

Akhirnya, saya pikir perlu dicatat abstrak dari man 5 crontab

... Format perintah cron sangat mirip dengan standar V7, dengan sejumlah ekstensi yang kompatibel ke atas. Setiap baris memiliki lima bidang waktu dan tanggal, diikuti oleh perintah, diikuti oleh karakter baris baru ('\ n'). Sistem crontab (/ etc / crontab) menggunakan format yang sama, kecuali bahwa nama pengguna untuk perintah ditentukan setelah bidang waktu dan tanggal dan sebelum perintah. Kolom dapat dipisahkan oleh spasi atau tab. Panjang maksimum yang diizinkan untuk bidang perintah adalah 998 karakter. ...

dmytro.poliarush
sumber
0

Pertama-tama, Anda harus login sebagai root:

sudo -i

Kemudian buka crontab:

crontab -e

Setelah itu, tambahkan skrip Anda ke crontab sebagai root seperti di bawah ini:

@reboot root / home / user1 / Desktop / my_script

Akibatnya saya melihat bahwa skrip saya berfungsi dengan baik.

Catatan: Jika Anda mengedit crontab dengan pengguna Anda saat ini, reboot tidak dapat memanggil skrip Anda dengan benar.

Mustafa Kemal
sumber
-1

prueba:

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

usuario @ ubuntu: ~ $ $ crontrab -e

@reboot /home/usuario/script.sh

simpan dan mulai ulang pc Anda

manusia
sumber