Bagaimana Anda menjalankan crontab di Cygwin pada Windows?

98

Beberapa perintah cygwin adalah .exefile, sehingga Anda dapat menjalankannya dengan Penjadwal Windows standar, tetapi yang lain tidak memiliki .exeekstensi sehingga tidak dapat dijalankan dari DOS (sepertinya).

Misalnya saya ingin updatedblari malam.

Bagaimana cara membuat cron berfungsi?

pengguna10306
sumber

Jawaban:

91

Anda juga perlu menginstal cygrunsrvsehingga Anda dapat mengatur cron sebagai layanan windows, lalu jalankan cron-config.

Jika Anda ingin cron job mengirim email dari keluaran apa pun, Anda juga harus menginstal salah satu eximatau ssmtp(sebelum menjalankan cron-config.)

Lihat /usr/share/doc/Cygwin/cron-*.READMEuntuk lebih jelasnya.

Mengenai program tanpa .exeekstensi, mereka mungkin adalah skrip shell dari beberapa jenis. Jika Anda melihat baris pertama file, Anda dapat melihat program apa yang perlu Anda gunakan untuk menjalankannya (mis., " #!/bin/sh"), Jadi Anda mungkin dapat mengeksekusinya dari windows scheduler dengan memanggil program shell (mis., " C:\cygwin\bin\sh.exe -l /my/cygwin/path/to/prog". )

Evan
sumber
1
perhatikan bahwa meskipun Anda memberitahukannya untuk TIDAK menggunakan akun lain, itu akan tetap menggunakan seteuid (atau sesuatu) dan gagal dengan samar dan kontradiktif can't switch user contextmeskipun permintaan eksplisit dibuat TIDAK untuk menggunakan akun lain. Beralih akun dengan cron di cygwin tampaknya WAJIB. Anda harus mengatakan TIDAK untuk menjalankan sebagai diri Anda sendiri ...
pengguna3338098
dan opsi -n dari cron cygwin sama-sama tidak ada artinya karena tidak peduli semua kejadian masuk ke log peristiwa windows. dokumentasi yang mengerikan dan menipu di bagian cygwin / cron.
pengguna3338098
1
Tip: gunakan croneventsperintah untuk melihat kejadian (dari jendela evengs log). Mereka tidak pernah dibuang, saya akan memangkas batangnya setiap beberapa bulan.
Gene Pavlovsky
Ada beberapa dokumen tambahan di sini, tentang cara mengatasi masalah setuid: davidjnice.com/cygwin_cron_service.html
Holger Böhnke
71

Anda memiliki dua pilihan:

  1. Instal cron sebagai layanan windows, menggunakan cygrunsrv:

    cygrunsrv -I cron -p /usr/sbin/cron -a -n
    
    net start cron
    

    Catatan, di versi cron (sangat) lama Anda perlu menggunakan -D, bukan -n

  2. File 'non .exe' mungkin adalah skrip bash, jadi Anda dapat menjalankannya melalui penjadwal windows dengan menjalankan bash untuk menjalankan skrip, misalnya:

    C:\cygwin\bin\bash.exe -l -c "./full-path/to/script.sh"
    
edoloughlin.dll
sumber
3
Saya terutama menyukai metode bash.exe. Terima kasih.
barrypicker
4
BTW, saya perlu menentukan jalur sebagai jalur bergaya unix - untuk memperbaruib, seluruh perintah saya yang dijadwalkan dengan penjadwal tugas windows tampak seperti ... c: \ cygwin \ bin \ bash.exe -l -c "/ usr / bin / updatedb "
barrypicker
2
Saya merekomendasikan metode dalam jawaban ini. Saya dapat menggunakan C: \ cygwin \ bin \ bash.exe -l -c "C: \ full-path \ to \ script.sh" di windows 7.
Jazzepi
2
jika ini tidak berhasil, Anda mungkin ingin mengganti -D dengan -n: cygrunsrv -I cron -p / usr / sbin / cron -a -D
Benlitz
2
Saya menggunakan cygrunsrv v1.62 dan '-D' bukan opsi yang valid, oleh karena itu layanan segera keluar setelah dimulai. '-n' sebaiknya digunakan sebagai pengganti '-D' untuk mencegah layanan keluar dengan sendirinya.
eaykin
23

tip topi http://linux.subogero.com/894/cron-on-cygwin/

Mulai setup cygwin dan tambahkan paket "cron" dari kategori "Admin".

Kami akan menjalankan cron sebagai layanan oleh SISTEM pengguna. SISTEM yang buruk karenanya membutuhkan direktori home dan shell. File "/ etc / passwd" akan mendefinisikannya.

$ mkdir /root
$ chown SYSTEM:root /root
$ mcedit /etc/passwd
SYSTEM:*:......:/root:/bin/bash

Memulai layanan:

$ cron-config
Do you want to remove or reinstall it (yes/no) yes
Do you want to install the cron daemon as a service? (yes/no) yes
Enter the value of CYGWIN for the daemon: [ ] ntsec
Do you want the cron daemon to run as yourself? (yes/no) no
Do you want to start the cron daemon as a service now? (yes/no) yes

Pengguna lokal sekarang dapat menentukan tugas terjadwal mereka seperti ini (crontab akan memulai editor favorit Anda):

$ crontab -e  # edit your user specific cron-table HOME=/home/foo
PATH=/usr/local/bin:/usr/bin:/bin:$PATH
# testing - one per line
* * * * *   touch ~/cron
@reboot     ~/foo.sh
45 11 * * * ~/lunch_message_to_mates.sh

Pengguna domain : tidak berfungsi. Cron yang buruk tidak dapat menjalankan tugas terjadwal atas nama pengguna domain di mesin. Tetapi ada cara lain: cron juga menjalankan hal-hal yang ditemukan di tabel cron level sistem di "/ etc / crontab". Jadi masukkan suff Anda di sana, sehingga SYSTEM melakukannya atas namanya sendiri:

$ touch /etc/crontab
$ chown SYSTEM /etc/crontab
$ mcedit /etc/crontab
HOME=/root
PATH=/usr/local/bin:/usr/bin:/bin:$PATH
* * * * *   SYSTEM touch ~/cron
@reboot     SYSTEM rm -f /tmp/.ssh*

Akhirnya beberapa kata tentang entri crontab. Mereka adalah pengaturan lingkungan atau perintah terjadwal. Seperti yang terlihat di atas, di Cygwin yang terbaik adalah membuat PATH yang dapat digunakan. Home dir dan shell biasanya diambil dari “/ etc / passwd”.

Mengenai kolom dari perintah terjadwal lihat halaman manual.

Jika entri crontab tertentu tidak berjalan, alat diagnostik terbaik adalah ini:

$ cronevents
rhoracio
sumber
1
Tidak ada alasan untuk menyetel CYGWIN ke ntsec. Itu sudah usang. cygwin.com/cygwin-ug-net/using-cygwinenv.html
yam655
Bagaimana Anda menjalankan Cygwin sebagai SISTEM?
niken
Meskipun kami menggunakan cygwin sshd dengan otentikasi iklan, saya tidak dapat membuat cron bekerja dengan cara yang sama atau dengan passwd -R. Satu-satunya cara yang berhasil bagi saya adalah menjalankan cron sebagai layanan untuk pengguna yang ditunjuk dan melakukan semua tugas cron dengan pengguna ini. (Cygwin 2.8.0)
MortenB
7

Hanya ingin menambahkan bahwa opsi ke cron sepertinya telah berubah. Perlu melewati -n, bukan -D.

cygrunsrv -I cron -p /usr/sbin/cron -a -n
Reg Whitton
sumber
3

Menerapkan instruksi dari jawaban ini dan berhasil. Hanya untuk menunjukkan lebih banyak copy paste seperti jawaban (karena prosedur instalasi cygwin adalah jenis anti-copy-paste yang diterapkan)
Klik tombol WinLogo, ketik cmd.exe, klik kanan, pilih " Mulai Sebagai Administrator ". Dalam prompt cmd :

 cd <directory_where_i_forgot_the setup-x86_64.exe> cygwin installer:
 set package_name=cygrunsrv cron
 setup-x86_64.exe -n -q -s http://cygwin.mirror.constant.com -P %package_name%

Pastikan penginstal tidak menampilkan kesalahan apa pun di prompt ... Jika ada - Anda mungkin menjalankan beberapa binari cygwin atau Anda bukan admin Windows, atau beberapa bug aneh ...

Sekarang di cmd promt:

 C:\cygwin64\bin\cygrunsrv.exe -I cron -p /usr/sbin/cron -a -D   

atau jalur file lengkap apa pun yang Anda miliki ke cygrunsrv.exe dan mulai cron sebagai layanan windows di prompt cmd

 net start cron

Sekarang di terminal bash jalankan crontab -e

mengatur Anda cron entri contoh di bawah ini:

        #sync my gdrive each 10th minute
    */10 * * * * /home/Yordan/sync_gdrive.sh

    # * * * * * command to be executed
    # - - - - -
    # | | | | |
    # | | | | +- - - - day of week (0 - 6) (Sunday=0)
    # | | | +- - - - - month (1 - 12)
    # | | +- - - - - - day of month (1 - 31)
    # | +- - - - - - - hour (0 - 23)
    # +--------------- minute
Yordan Georgiev
sumber
set package_name = cygrunsrv cron tidak berfungsi Saya harus menginstalnya secara terpisah. Terus mendapatkan "cygrunsrv: Mengingat jalan tidak menunjuk ke executable yang valid"
rob
Layanan tidak akan mulai tetapi mencari di /var/log/cron.log menunjukkan bahwa -D harus -n. Menjalankan "c: \ cygwin64 \ bin \ cygrunsrv.exe -R cron" dan kemudian "c: \ cygwin64 \ bin \ cygrunsrv.exe -I cron -p / usr / sbin / cron -a -n" memperbaikinya.
merampok
1
cygrunsrv: Kesalahan menginstal layanan: OpenSCManager: Win32 error 5: Akses ditolak.
niken
3

Saya menemukan cara agar layanan cron Cygwin berjalan secara otomatis ketika saya masuk ke Windows 7. Inilah yang berhasil untuk saya:

Menggunakan Notepad, buat file C:\cygwin\bin\Cygwin_launch_crontab_service_input.txtdengan konten nodi baris pertama dan yesbaris kedua (tanpa tanda kutip). Ini adalah dua tanggapan Anda terhadap petunjuk untuk cron-config.

Buat file C:\cygwin\Cygwin_launch_crontab_service.batdengan konten:

@echo off
C:
chdir C:\cygwin\bin
bash  cron-config < Cygwin_launch_crontab_service_input.txt

Tambahkan Pintasan berikut ini di folder Startup Windows: Cygwin_launch_crontab_service.bat

Lihat http://www.sevenforums.com/tutorials/1401-startup-programs-change.html jika Anda memerlukan bantuan tentang cara menambahkan ke Startup. BTW, Anda dapat menambahkan ini secara opsional di Startup jika Anda ingin:

Cygwin

Server XWin

Yang pertama dijalankan

C:\cygwin\Cygwin.bat

dan yang kedua dieksekusi

C:\cygwin\bin\run.exe /usr/bin/bash.exe -l -c /usr/bin/startxwin.exe
Jerome Fehribach
sumber
1

Sintaks yang benar untuk menginstal cron di cygwin sebagai layanan Windows adalah dengan meneruskan -n sebagai argumen dan bukan -D :

cygrunsrv --install cron --path / usr / sbin / cron --args -n

-D mengembalikan kesalahan penggunaan saat memulai cron di cygwin:

$

$ cygrunsrv --install cron --path / usr / sbin / cron --args -D

$ cygrunsrv --mulai cron

cygrunsrv: Kesalahan memulai layanan: QueryServiceStatus: Win32 error 1062:

Layanan belum dimulai.

$ cat /var/log/cron.log

cron: opsi tidak diketahui - D

penggunaan: / usr / sbin / cron [-n] [-x [ext, sch, proc, parc, load, misc, test, bit]]

$

Halaman di bawah ini memiliki penjelasan yang bagus.

Menginstal & Mengonfigurasi Layanan Cygwin Cron di Windows: https://www.davidjnice.com/cygwin_cron_service.html

PS Saya harus menjalankan Terminal Cygwin64 pada PC Windows 10 saya sebagai administrator untuk menginstal cron sebagai layanan Windows.

Shen
sumber
0
Getting updatedb to work in cron on Cygwin -- debugging steps
1) Make sure cron is installed.
 a) Type 'cron' tab tab and look for completion help.
   You should see crontab.exe, cron-config, etc.  If not install cron using setup.
2) Run cron-config.  Be sure to read all the ways to diagnose cron.
3) Run crontab -e
 a) Create a test entry of something simple, e.g.,
   "* * * * * echo $HOME >> /tmp/mycron.log" and save it.
4) cat /tmp/mycron.log.  Does it show cron environment variable HOME
   every minute?
5) Is HOME correct?  By default mine was /home/myusername; not what I wanted.
   So, I added the entry
   "HOME='/cygdrive/c/documents and settings/myusername'" to crontab.
6) Once assured the test entry works I moved on to 'updatedb' by
   adding an entry in crontab.
7) Since updatedb is a script, errors of sed and find showed up in
   my cron.log file.  In the error line, the absolute path of sed referenced
   an old version of sed.exe and not the one in /usr/bin.  I tried changing my
   cron PATH environment variable but because it was so long crontab
   considered the (otherwise valid) change to be an error.  I tried an
   explicit much-shorter PATH command, including what I thought were the essential
   WINDOWS paths but my cron.log file was empty.  Eventually I left PATH alone and
   replaced the old sed.exe in the other path with sed.exe from /usr/bin.
   After that updatedb ran to completion.  To reduce the number of
   permission error lines I eventually ended up with this:
   "# Run updatedb at 2:10am once per day skipping Sat and Sun'
   "10 2  *  *  1-5  /usr/bin/updatedb --localpaths='/cygdrive/c' --prunepaths='/cygdrive/c/WINDOWS'"

Notes: I ran cron-config several times throughout this process
       to restart the cygwin cron daemon.
Harry Rockefeller
sumber