Windows üzerinde Cygwin'de bir crontab'ı nasıl çalıştırırsınız?


98

Bazı cygwin komutları .exedosyalardır, bu nedenle bunları standart Windows Zamanlayıcı ile çalıştırabilirsiniz, ancak bazılarının bir .exeuzantısı yoktur, bu nedenle DOS'tan çalıştırılamaz (öyle görünüyor).

Örneğin ben updatedbgece koşmak istiyorum .

Cron'u nasıl çalıştırırım?

Yanıtlar:


91

Ayrıca cygrunsrv, cron'u bir Windows hizmeti olarak ayarlayabilmeniz ve ardından çalıştırabilmeniz için yüklemeniz gerekir cron-config.

Cron işlerinin herhangi bir çıktı için e-posta göndermesini istiyorsanız, ya eximda ssmtp(çalıştırmadan önce cron-config) yüklemeniz gerekir .

Daha /usr/share/doc/Cygwin/cron-*.READMEfazla ayrıntı için bakın.

.exeUzantısı olmayan programlarla ilgili olarak , bunlar muhtemelen bir türden kabuk betikleridir. Dosyanın ilk satırına bakarsanız, onları çalıştırmak için hangi programı kullanmanız gerektiğini görebilirsiniz (örneğin, " #!/bin/sh"), böylece bunları, kabuk programını çağırarak (örn., " ") Windows planlayıcısından çalıştırabilirsiniz C:\cygwin\bin\sh.exe -l /my/cygwin/path/to/prog. )


1
Diğer hesapları KULLANMAMASINI söyleseniz bile, seteuid'i (veya başka bir şeyi) kullanacağını can't switch user contextve açık bir talep başka hesapları KULLANMAMAK için yapılmış olsa bile şifreli ve çelişkili bir şekilde başarısız olacağını unutmayın. Görünüşe göre cygwin'de cron ile hesap değişimi ZORUNLU. Kendiniz olarak koşmaya HAYIR
demelisiniz

ve cygwin'in cronunun -n seçeneği, tüm olaylar Windows olay günlüğüne ne olursa olsun eşit derecede anlamsızdır. Cygwin / cron ile ilgili korkunç ve aldatıcı belgeler.
user3338098

1
İpucu: croneventsOlayları görüntülemek için komut kullanın (Windows evengs günlüğünden). Asla atılmazlar, günlükleri birkaç ayda bir budardım.
Gene Pavlovsky

Burada setuid probleminin nasıl çözüleceğine dair bazı genişletilmiş dokümanlar var: davidjnice.com/cygwin_cron_service.html
Holger Böhnke

71

İki seçeneğiniz var:

  1. Cygrunsrv kullanarak cron'u bir Windows hizmeti olarak kurun:

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

    Not, cron'un (çok) eski sürümlerinde -n yerine -D kullanmanız gerekir.

  2. '.Exe olmayan' dosyalar büyük olasılıkla bash betikleridir, bu nedenle bunları, komut dosyasını çalıştırmak için bash çağırarak Windows zamanlayıcı aracılığıyla çalıştırabilirsiniz, örneğin:

    C:\cygwin\bin\bash.exe -l -c "./full-path/to/script.sh"
    

3
Özellikle bash.exe yöntemini beğendim. Teşekkürler.
barrypicker

4
BTW, yolu unix tarzı bir yol olarak belirtmem gerekiyordu - güncelleme için Windows görev zamanlayıcı ile planlanan tüm komutum şöyle görünüyordu ... c: \ cygwin \ bin \ bash.exe -l -c "/ usr / bin /
updatedb

2
Bu cevapta yöntemi kesinlikle tavsiye ediyorum. Windows 7'de C: \ cygwin \ bin \ bash.exe -l -c "C: \ full-path \ to \ script.sh" komutunu kullanabildim.
Jazzepi

2
bu işe yaramazsa -D'yi -n ile değiştirmek isteyebilirsiniz: cygrunsrv -I cron -p / usr / sbin / cron -a -D
Benlitz

2
Cygrunsrv v1.62 kullanıyorum ve '-D' geçerli bir seçenek değil, bu nedenle hizmet başlatıldıktan hemen sonra çıkıyor. Hizmetin kendi kendine çıkmasını önlemek için '-D' yerine '-n' kullanılmalıdır.
eaykin

24

şapka ipucu http://linux.subogero.com/894/cron-on-cygwin/

Cygwin kurulumunu başlatın ve "Yönetici" kategorisinden "cron" paketini ekleyin.

Cron'u kullanıcı SYSTEM tarafından bir hizmet olarak çalıştıracağız. Zayıf SİSTEM bu nedenle bir ana dizine ve bir kabuğa ihtiyaç duyar. "/ Etc / passwd" dosyası onları tanımlayacaktır.

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

Servisi başlatmak:

$ 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

Yerel kullanıcılar artık planlanmış görevlerini şu şekilde tanımlayabilir (crontab favori düzenleyicinizi başlatır):

$ 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

Etki alanı kullanıcıları : çalışmıyor. Zayıf cron, makinedeki etki alanı kullanıcıları adına zamanlanmış görevleri çalıştıramaz. Ancak başka bir yol daha var: cron ayrıca "/ etc / crontab" içindeki sistem seviyesi cron tablosunda bulunan şeyleri de çalıştırır. Öyleyse, yetinizi oraya ekleyin, böylece SYSTEM bunu kendi adına yapar:

$ 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*

Son olarak crontab girişleri hakkında birkaç söz. Ya ortam ayarları ya da zamanlanmış komutlardır. Yukarıda görüldüğü gibi, Cygwin'de kullanılabilir bir YOL oluşturmak en iyisidir. Ana dizin ve kabuk normalde "/ etc / passwd" dosyasından alınır.

Zamanlanmış komutların sütunlarıyla ilgili olarak kılavuz sayfasına bakın.

Belirli crontab girişleri çalışmazsa, en iyi tanı aracı şudur:

$ cronevents

1
CYGWIN'i ntsec olarak ayarlamak için bir neden yok. Modası geçmiş. cygwin.com/cygwin-ug-net/using-cygwinenv.html
yam655

Cygwin'i SYSTEM olarak nasıl çalıştırıyorsunuz?
niken

Cygwin sshd'yi reklam kimlik doğrulaması ile kullanmamıza rağmen, cron'un aynı şekilde veya passwd -R ile çalışmasını sağlayamadım. Benim için işe yaramasının tek yolu, belirlenmiş bir kullanıcı için bir hizmet olarak cron'u çalıştırmak ve tüm cron işlerini bu kullanıcıyla yapmaktı. (Cygwin 2.8.0)
MortenB

7

Sadece cron seçeneklerinin değişmiş gibi göründüğünü eklemek istedim. -D yerine -n ​​geçmesi gerekir.

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

3

Talimat Uygulanan bu cevap ve (cygwin kurulum prosedürü tür bilge uygulanan-yapıştırma karşıtı kopyanın olduğu için) daha cevap gibi kopyalayıp yapıştırın işaret etmek Just çalıştı
"seçin sağ tıklayın, WinLogo düğmesini, cmd.exe tıklayın Yönetici Olarak Başlayın ". In cmd istemi:

 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%

Yükleyicinin istemde herhangi bir hata atmadığından emin olun ... Varsa - muhtemelen çalışan bazı cygwin ikili dosyalarınız vardır veya bir Windows yöneticisi değilsiniz veya bazı garip hata ...

Şimdi cmd isteminde:

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

veya cygrunsrv.exe dosyasında sahip olabileceğiniz tam dosya yolu ve cmd isteminde Windows hizmeti olarak cron'u başlatın

 net start cron

Şimdi bash terminalinde crontab -e çalıştırın

cron girişini bir örnek olarak ayarlayın:

        #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

set package_name = cygrunsrv cron çalışmadı Ayrı ayrı yüklemem gerekiyordu. Tuttu alma "cygrunsrv: yol Verilen geçerli bir yürütülebilir noktası değil"
soymak

Hizmet başlamadı, ancak /var/log/cron.log dosyasına bakmak -D'nin -n olması gerektiğini gösterdi. "C: \ cygwin64 \ bin \ cygrunsrv.exe -R cron" ve ardından "c: \ cygwin64 \ bin \ cygrunsrv.exe -I cron -p / usr / sbin / cron -a -n" çalıştırıldığında sorun çözüldü.
soymak

1
cygrunsrv: Bir hizmet yükleme hatası: OpenSCManager: Win32 hatası 5: Erişim reddedildi.
niken

3

Windows 7'de oturum açtığımda Cygwin cron hizmetinin otomatik olarak nasıl çalıştırılacağını buldum. İşte benim için ne işe yaradı:

Not Defteri'ni kullanarak , ilk satırda ve ikinci satırda (tırnak işaretleri olmadan) C:\cygwin\bin\Cygwin_launch_crontab_service_input.txtiçeriğe sahip dosya oluşturun . Bunlar, istemlere vereceğiniz iki yanıttır .noyescron-config

C:\cygwin\Cygwin_launch_crontab_service.batİçeriğe sahip dosya oluşturun :

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

Windows Başlangıç ​​klasöründe aşağıdakilere bir Kısayol ekleyin: Cygwin_launch_crontab_service.bat

Başlangıç'a nasıl ekleneceği konusunda yardıma ihtiyacınız varsa http://www.sevenforums.com/tutorials/1401-startup-programs-change.html adresine bakın . BTW, isterseniz bunları Başlangıçta isteğe bağlı olarak ekleyebilirsiniz:

Cygwin

XWin Sunucusu

İlki yürütür

C:\cygwin\Cygwin.bat

ve ikincisi yürütür

C:\cygwin\bin\run.exe /usr/bin/bash.exe -l -c /usr/bin/startxwin.exe

1

Doğru sözdizimi yüklemek için cron'u Windows hizmet geçmektir olarak cygwin içinde -n argüman olarak değil -D :

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

-D , cygwin'de cron başlatıldığında kullanım hatasıveriyor:

$

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

$ cygrunsrv --start cron

cygrunsrv: Bir hizmet başlatılırken hata oluştu: QueryServiceStatus: Win32 hatası 1062:

Hizmet başlatılmadı.

$ cat /var/log/cron.log

cron: bilinmeyen seçenek - D

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

$

Aşağıdaki sayfada iyi bir açıklama var.

Windows'ta Cygwin Cron Hizmetini Kurmak ve Yapılandırmak: https://www.davidjnice.com/cygwin_cron_service.html

PS Windows hizmeti olarak cron'u kurmak için Windows 10 bilgisayarımda Cygwin64 Terminalini yönetici olarak çalıştırmam gerekiyordu .


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.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.