Come si esegue un crontab in Cygwin su Windows?


98

Alcuni comandi cygwin sono .exefile, quindi puoi eseguirli con lo standard di pianificazione di Windows, ma altri non hanno .exeun'estensione quindi non possono essere eseguiti da DOS (sembra).

Ad esempio, voglio updatedbcorrere di notte.

Come faccio a far funzionare cron?

Risposte:


91

È inoltre necessario installare in cygrunsrvmodo da poter impostare cron come servizio Windows, quindi eseguire cron-config.

Se desideri che i cron job inviino email di qualsiasi output, dovrai anche installare eximo ssmtp(prima di eseguire cron-config).

Vedi /usr/share/doc/Cygwin/cron-*.READMEper maggiori dettagli.

Per quanto riguarda i programmi senza .exeestensione, sono probabilmente script di shell di qualche tipo. Se guardi la prima riga del file potresti vedere quale programma devi usare per eseguirli (es. " #!/bin/sh"), Quindi potresti forse eseguirli dallo scheduler di Windows chiamando il programma shell (es. " C:\cygwin\bin\sh.exe -l /my/cygwin/path/to/prog". )


1
nota che anche se gli dici di NON usare altri account, userà comunque seteuid (o qualcosa del genere) e fallirà con un criptico e contraddittorio can't switch user contextanche se è stata fatta esplicita richiesta di NON usare altri account. Il cambio di account con cron su cygwin è apparentemente OBBLIGATORIO. Devi dire NO a correre come te stesso ...
user3338098

e l'opzione -n ​​di cron di cygwin è ugualmente priva di significato, indipendentemente da ciò che tutti gli eventi vanno nel registro eventi di Windows. documentazione terribile e ingannevole da parte di cygwin / cron.
user3338098

1
Suggerimento: utilizzare il croneventscomando per visualizzare gli eventi (dal registro di Windows evengs). Non vengono mai scartati, potrei i tronchi ogni pochi mesi.
Gene Pavlovsky

Ci sono alcuni documenti estesi qui, su come aggirare il problema di setuid: davidjnice.com/cygwin_cron_service.html
Holger Böhnke

71

Hai due opzioni:

  1. Installa cron come servizio Windows, usando cygrunsrv:

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

    Nota, nelle (molto) vecchie versioni di cron devi usare -D invece di -n

  2. I file 'non .exe' sono probabilmente script bash, quindi puoi eseguirli tramite lo scheduler di Windows invocando bash per eseguire lo script, ad esempio:

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

3
Mi è piaciuto particolarmente il metodo bash.exe. Grazie.
barrypicker

4
A proposito, avevo bisogno di specificare il percorso come un percorso in stile unix - per updatedb il mio intero comando pianificato con l'utilità di pianificazione di Windows sembrava ... c: \ cygwin \ bin \ bash.exe -l -c "/ usr / bin /
updatedb

2
Consiglio vivamente il metodo in questa risposta. Sono stato in grado di utilizzare C: \ cygwin \ bin \ bash.exe -l -c "C: \ full-path \ to \ script.sh" su Windows 7.
Jazzepi

2
se questo non funziona potresti voler sostituire -D con -n: cygrunsrv -I cron -p / usr / sbin / cron -a -D
Benlitz

2
Sto usando cygrunsrv v1.62 e '-D' non è un'opzione valida, quindi il servizio esce immediatamente dopo essere stato avviato. '-n' dovrebbe essere usato al posto di '-D' per impedire che il servizio si chiuda da solo.
eaykin

23

cappello a punta http://linux.subogero.com/894/cron-on-cygwin/

Avvia cygwin-setup e aggiungi il pacchetto "cron" dalla categoria "Admin".

Eseguiremo cron come servizio dall'utente SYSTEM. Un povero SYSTEM necessita quindi di una directory home e di una shell. Il file "/ etc / passwd" li definirà.

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

L'avvio del servizio:

$ 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

Gli utenti locali ora possono definire le loro attività pianificate in questo modo (crontab avvierà il tuo editor preferito):

$ 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

Utenti di dominio : non funziona. Un cron scadente non è in grado di eseguire attività pianificate per conto degli utenti del dominio sulla macchina. Ma c'è un altro modo: cron esegue anche cose trovate nella tabella cron a livello di sistema in "/ etc / crontab". Quindi inserisci qui il tuo suff, in modo che SYSTEM lo faccia per proprio conto:

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

Infine alcune parole sulle voci crontab. Sono impostazioni dell'ambiente o comandi pianificati. Come visto sopra, su Cygwin è meglio creare un PATH utilizzabile. La directory home e la shell sono normalmente prese da "/ etc / passwd".

Per quanto riguarda le colonne dei comandi schedulati vedere la pagina di manuale.

Se alcune voci di crontab non vengono eseguite, il miglior strumento di diagnostica è questo:

$ cronevents

1
Non c'è motivo per impostare CYGWIN su ntsec. È obsoleto. cygwin.com/cygwin-ug-net/using-cygwinenv.html
yam655

Come gestisci Cygwin come SYSTEM?
Niken

Sebbene utilizziamo cygwin sshd con l'autenticazione dell'annuncio, non sono riuscito a far funzionare cron allo stesso modo o con passwd -R. L'unico modo in cui ha funzionato per me era eseguire cron come servizio per un utente designato e fare tutti i lavori di cron con questo utente. (Cygwin 2.8.0)
MortenB

7

Volevo solo aggiungere che le opzioni per cron sembrano essere cambiate. È necessario passare -n anziché -D.

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

3

Applicato le istruzioni da questa risposta e ha funzionato solo per indicare una più copia incolla come risposta (perché la procedura di installazione di cygwin è una sorta di anti-copia-incolla implementata)
Fare clic sul pulsante WinLogo, digitare cmd.exe, fare clic con il tasto destro, scegliere " Avvia come amministratore ". Nel prompt di 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%

Assicurati che il programma di installazione non generi errori nel prompt ... In caso affermativo, probabilmente hai alcuni binari di cygwin in esecuzione o non sei un amministratore di Windows o qualche bug strano ...

Ora in cmd promt:

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

o qualsiasi percorso completo del file che potresti avere per cygrunsrv.exe e avvia il cron come servizio di Windows nel prompt di cmd

 net start cron

Ora nel terminale bash esegui crontab -e

imposta la tua voce cron un esempio sotto:

        #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 nome_pacchetto = cygrunsrv cron non ha funzionato, ho dovuto installarli separatamente. Continuato a ricevere "cygrunsrv: il percorso specificato non punta a un eseguibile valido"
rapina

Il servizio non si avviava ma la ricerca in /var/log/cron.log ha mostrato che -D dovrebbe essere -n. L'esecuzione di "c: \ cygwin64 \ bin \ cygrunsrv.exe -R cron" e quindi "c: \ cygwin64 \ bin \ cygrunsrv.exe -I cron -p / usr / sbin / cron -a -n" ha risolto il problema.
rapinare il

1
cygrunsrv: Errore durante l'installazione di un servizio: OpenSCManager: Win32 errore 5: Accesso negato.
Niken

3

Ho capito come far funzionare automaticamente il servizio cron di Cygwin quando ho effettuato l'accesso a Windows 7. Ecco cosa ha funzionato per me:

Utilizzando Blocco note, crea un file C:\cygwin\bin\Cygwin_launch_crontab_service_input.txtcon il contenuto nosulla prima riga e yessulla seconda riga (senza virgolette). Queste sono le tue due risposte alle richieste di cron-config.

Crea file C:\cygwin\Cygwin_launch_crontab_service.batcon contenuto:

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

Aggiungi un collegamento a quanto segue nella cartella Avvio di Windows: Cygwin_launch_crontab_service.bat

Vedi http://www.sevenforums.com/tutorials/1401-startup-programs-change.html se hai bisogno di aiuto su come aggiungere a Startup. BTW, puoi opzionalmente aggiungerli in Startup se desideri:

Cygwin

XWin Server

Il primo viene eseguito

C:\cygwin\Cygwin.bat

e il secondo viene eseguito

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

1

La sintassi corretta per installare cron in cygwin come servizio Windows è passare -n come argomento e non -D :

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

-D restituisce un errore di utilizzo all'avvio di cron in cygwin:

$

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

$ cygrunsrv --start cron

cygrunsrv: Errore durante l'avvio di un servizio: QueryServiceStatus: Win32 errore 1062:

Il servizio non è stato avviato.

$ cat /var/log/cron.log

cron: opzione sconosciuta - D

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

$

La pagina sotto ha una buona spiegazione.

Installazione e configurazione del servizio Cygwin Cron in Windows: https://www.davidjnice.com/cygwin_cron_service.html

PS Ho dovuto eseguire Cygwin64 Terminal sul mio PC Windows 10 come amministratore per installare cron come servizio Windows.


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.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.