Jak uruchomić crontab w Cygwin w systemie Windows?

98

Niektóre polecenia cygwin są .exeplikami, więc możesz je uruchamiać za pomocą standardowego harmonogramu systemu Windows, ale inne nie mają .exerozszerzenia, więc nie można ich uruchomić z DOS (wydaje się).

Na przykład chcę updatedbbiegać co noc.

Jak sprawić, by cron działał?

user10306
źródło

Odpowiedzi:

91

Musisz także zainstalować, cygrunsrvaby móc skonfigurować cron jako usługę systemu Windows, a następnie uruchomić cron-config.

Jeśli chcesz, aby crona aby wysłać e-mail z dowolnego wyjścia musisz również zainstalować albo eximalbo ssmtp(przed uruchomieniem cron-config).

Zobacz, /usr/share/doc/Cygwin/cron-*.READMEaby uzyskać więcej informacji.

Jeśli chodzi o programy bez .exerozszerzenia, są to prawdopodobnie skrypty powłoki pewnego typu. Jeśli spojrzysz na pierwszą linię pliku, zobaczysz, jakiego programu potrzebujesz do ich uruchomienia (np. „ #!/bin/sh”), Więc być może możesz wykonać je z harmonogramu systemu Windows, wywołując program powłoki (np. „ C:\cygwin\bin\sh.exe -l /my/cygwin/path/to/prog”. )

Evan
źródło
1
zwróć uwagę, że nawet jeśli powiesz mu, aby NIE korzystał z innych kont, nadal będzie używał seteuid (lub czegoś podobnego) i zakończy się niepowodzeniem z tajemniczym i sprzecznym rozwiązaniem, can't switch user contextmimo że wyraźnie zażądano, aby NIE używać innych kont. Zmiana konta za pomocą crona na cygwin jest najwyraźniej OBOWIĄZKOWA. Musisz powiedzieć NIE bieganiu jako siebie ...
user3338098
a opcja -n crona cygwina jest równie bez znaczenia, jak bez względu na to, jakie zdarzenia trafiają do dziennika zdarzeń systemu Windows. straszna i zwodnicza dokumentacja ze strony cygwin / cron.
user3338098
1
Wskazówka: użyj croneventspolecenia, aby wyświetlić zdarzenia (z dziennika evengs systemu Windows). Nigdy ich nie wyrzucamy, ciąłbym kłody co kilka miesięcy.
Gene Pavlovsky
Jest tutaj kilka rozszerzonych dokumentów, jak obejść problem setuid: davidjnice.com/cygwin_cron_service.html
Holger Böhnke
71

Masz dwie możliwości:

  1. Zainstaluj crona jako usługę systemu Windows, używając cygrunsrv:

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

    Uwaga, w (bardzo) starych wersjach crona należy użyć -D zamiast -n

  2. Pliki `` inne niż .exe '' to prawdopodobnie skrypty bash, więc możesz je uruchomić za pomocą harmonogramu systemu Windows, wywołując bash w celu uruchomienia skryptu, np:

    C:\cygwin\bin\bash.exe -l -c "./full-path/to/script.sh"
    
edoloughlin
źródło
3
Szczególnie podobała mi się metoda bash.exe. Dzięki.
Barrypicker
4
Przy okazji, musiałem określić ścieżkę jako ścieżkę w stylu unixowym - dla updatedb całe moje polecenie zaplanowane w harmonogramie zadań systemu Windows wyglądało tak ... c: \ cygwin \ bin \ bash.exe -l -c "/ usr / bin / updatedb "
barrypicker
2
Zdecydowanie polecam metodę w tej odpowiedzi. Udało mi się użyć C: \ cygwin \ bin \ bash.exe -l -c "C: \ full-path \ to \ script.sh" w systemie Windows 7.
Jazzepi,
2
jeśli to nie zadziała, możesz zamienić -D na -n: cygrunsrv -I cron -p / usr / sbin / cron -a -D
Benlitz
2
Używam cygrunsrv v1.62, a „-D” nie jest prawidłową opcją, dlatego usługa kończy się natychmiast po uruchomieniu. Zamiast „-D” należy użyć opcji „-n”, aby zapobiec samoczynnemu zakończeniu usługi.
eaykin
23

wskazówka dotycząca kapelusza http://linux.subogero.com/894/cron-on-cygwin/

Uruchom cygwin-setup i dodaj pakiet „cron” z kategorii „Admin”.

Uruchomimy crona jako usługę przez użytkownika SYSTEM. Dlatego słaby SYSTEM potrzebuje katalogu domowego i powłoki. Plik „/ etc / passwd” będzie je definiować.

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

Uruchom usługę:

$ 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

Lokalni użytkownicy mogą teraz definiować swoje zaplanowane zadania w ten sposób (crontab uruchomi twój ulubiony edytor):

$ 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

Użytkownicy domeny : to nie działa. Słaby cron nie może uruchamiać zaplanowanych zadań w imieniu użytkowników domeny na komputerze. Ale jest inny sposób: cron uruchamia również rzeczy znalezione w tabeli cron na poziomie systemu w „/ etc / crontab”. Więc wstaw tam swój plik, aby SYSTEM zrobił to we własnym imieniu:

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

Na koniec kilka słów o wpisach crontab. Są to ustawienia środowiska lub zaplanowane polecenia. Jak widać powyżej, na Cygwin najlepiej jest utworzyć użyteczną ścieżkę PATH. Katalog domowy i powłoka są zwykle pobierane z „/ etc / passwd”.

Jeśli chodzi o kolumny zaplanowanych poleceń, zobacz stronę podręcznika.

Jeśli niektóre wpisy crontab nie działają, najlepszym narzędziem diagnostycznym jest:

$ cronevents
rhoracio
źródło
1
Nie ma powodu, aby ustawić CYGWIN na ntsec. Jest przestarzały. cygwin.com/cygwin-ug-net/using-cygwinenv.html
yam655
Jak uruchomić Cygwin jako SYSTEM?
niken
Chociaż używamy cygwin sshd z uwierzytelnianiem reklam, nie mogłem zmusić crona do pracy w ten sam sposób lub z passwd -R. Jedynym sposobem, w jaki to zadziałało, było uruchomienie crona jako usługi dla wyznaczonego użytkownika i wykonanie wszystkich zadań crona z tym użytkownikiem. (Cygwin 2.8.0)
MortenB
7

Chciałem tylko dodać, że opcje crona wydają się zmieniać. Należy przekazać -n zamiast -D.

cygrunsrv -I cron -p /usr/sbin/cron -a -n
Reg Whitton
źródło
3

Zastosowałem instrukcje z tej odpowiedzi i zadziałało Tylko po to, aby wskazać bardziej kopiuj wklej jak odpowiedź (ponieważ procedura instalacji Cygwin jest pewnego rodzaju zaimplementowaną
metodą zapobiegania kopiowaniu i wklejaniu) Kliknij przycisk WinLogo, wpisz cmd.exe, kliknij go prawym przyciskiem myszy, wybierz " Uruchom jako administrator ”. W zachęcie 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%

Upewnij się, że instalator nie zgłasza żadnych błędów w monicie ... Jeśli tak - prawdopodobnie masz uruchomione pliki binarne Cygwin lub nie jesteś administratorem systemu Windows lub jakiś dziwny błąd ...

Teraz w cmd promt:

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

lub jakąkolwiek pełną ścieżkę do pliku cygrunsrv.exe i uruchom cron jako usługę Windows w wierszu polecenia cmd

 net start cron

Teraz w terminalu bash uruchom crontab -e

Skonfiguruj wpis w cronie, przykład poniżej:

        #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
źródło
set nazwa_pakietu = cygrunsrv cron nie działał, musiałem je zainstalować osobno. Utrzymano pobieranie „cygrunsrv: podana ścieżka nie wskazuje na prawidłowy plik wykonywalny”
rob,
Usługa nie mogła się uruchomić, ale sprawdzenie w /var/log/cron.log wykazało, że -D powinno być -n. Uruchomienie "c: \ cygwin64 \ bin \ cygrunsrv.exe -R cron", a następnie "c: \ cygwin64 \ bin \ cygrunsrv.exe -I cron -p / usr / sbin / cron -a -n" naprawiło to.
Rob
1
cygrunsrv: Błąd podczas instalowania usługi: OpenSCManager: Błąd Win32 5: Odmowa dostępu.
niken
3

Dowiedziałem się, jak sprawić, by usługa Cygwin cron działała automatycznie po zalogowaniu się do systemu Windows 7. Oto, co zadziałało:

Za pomocą Notatnika utwórz plik C:\cygwin\bin\Cygwin_launch_crontab_service_input.txtz zawartością now pierwszej i yesdrugiej linii (bez cudzysłowów). To są twoje dwie odpowiedzi na monitycron-config .

Utwórz plik C:\cygwin\Cygwin_launch_crontab_service.batz zawartością:

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

Dodaj skrót do następujących elementów w folderze Autostart systemu Windows: Cygwin_launch_crontab_service.bat

Zobacz http://www.sevenforums.com/tutorials/1401-startup-programs-change.html jeśli potrzebujesz pomocy dotyczącej dodawania do Startup. BTW, możesz opcjonalnie dodać je w Startup, jeśli chcesz:

Cygwin

Serwer XWin

Pierwsza jest wykonywana

C:\cygwin\Cygwin.bat

a druga jest wykonywana

C:\cygwin\bin\run.exe /usr/bin/bash.exe -l -c /usr/bin/startxwin.exe
Jerome Fehribach
źródło
1

Prawidłowa składnia do zainstalowania crona w cygwin jako usłudze systemu Windows to przekazanie -n jako argumentu, a nie -D :

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

-D zwraca błąd użycia podczas uruchamiania crona w cygwin:

$

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

$ cygrunsrv --start cron

cygrunsrv: Błąd podczas uruchamiania usługi: QueryServiceStatus: Błąd Win32 1062:

Usługa nie została uruchomiona.

$ cat /var/log/cron.log

cron: nieznana opcja - D

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

$

Poniższa strona ma dobre wyjaśnienie.

Instalacja i konfiguracja usługi Cygwin Cron w systemie Windows: https://www.davidjnice.com/cygwin_cron_service.html

PS Musiałem uruchomić terminal Cygwin64 na moim komputerze z systemem Windows 10 jako administrator, aby zainstalować cron jako usługę Windows.

Shen
źródło
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
źródło