Як запускати кронтаб у Cygwin у Windows?


98

Деякі команди cygwin - це .exeфайли, тому ви можете запускати їх за допомогою стандартного планувальника Windows, але інші не мають .exeрозширення, тому не можна запускати з DOS (схоже, що).

Наприклад, я хочу updatedbбігати вночі.

Як змусити роботу з хроном?

Відповіді:


91

Вам також потрібно встановити, cygrunsrvщоб ви могли встановити cron як службу Windows, а потім запустити cron-config.

Якщо ви хочете, щоб завдання cron надсилали електронний лист будь-якого виводу, вам також потрібно буде встановити eximабо ssmtp(до запуску cron-config.)

Дивіться /usr/share/doc/Cygwin/cron-*.READMEдокладнішу інформацію.

Що стосується програм без .exeрозширення, вони, мабуть, є скриптами оболонки певного типу. Якщо ви подивитесь на перший рядок файлу, ви зможете побачити, яку програму потрібно використовувати для їх запуску (наприклад, " #!/bin/sh"), тож, можливо, ви можете їх виконати з планувальника Windows, зателефонувавши в програму оболонки (наприклад, " C:\cygwin\bin\sh.exe -l /my/cygwin/path/to/prog". )


1
зауважте, що навіть якщо ви скажете НЕ використовувати інші акаунти, він все одно буде використовувати seteuid (або щось подібне) і не спрацює з криптовалютою та суперечливістю, can't switch user contextнавіть якщо явний запит був зроблений НЕ використовувати інші акаунти. Переключення акаунтів на cgwin на cygwin, мабуть, ОБОВ'ЯЗКОВО. Ви повинні сказати "НІ", щоб працювати як себе ...
користувач3338098

а варіант -n cron cygwin є настільки ж безглуздим, як би незалежно від того, які всі події йдуть до журналу подій Windows. жахлива та оманлива документація з боку cygwin / cron.
користувач3338098

1
Порада: використовуйте croneventsкоманду для перегляду подій (з журналу вікон вікон). Їх ніколи не відкидають, я б обрізав колоди кожні кілька місяців.
Гена Павловського

Тут є кілька розширених документів про те, як подолати проблему встановлення: davidjnice.com/cygwin_cron_service.html
Holger Böhnke

71

У вас є два варіанти:

  1. Встановіть cron як сервіс Windows, використовуючи cygrunsrv:

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

    Зауважте, у (дуже) старих версіях cron потрібно використовувати -D замість -n

  2. Файли "non .exe" - це, ймовірно, скриптові сценарії, тому ви можете запустити їх через планувальник Windows, викликавши bash для запуску сценарію, наприклад:

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

3
Мені особливо сподобався метод bash.exe. Дякую.
barrypicker

4
BTW, мені потрібно було вказати шлях як шлях у стилі unix - для updateb вся моя команда, запланована з планувальником завдань Windows, виглядала як ... c: \ cygwin \ bin \ bash.exe -l -c "/ usr / bin / updatedb "
barrypicker

2
Я точно рекомендую метод у цій відповіді. Мені вдалося використати C: \ cygwin \ bin \ bash.exe -l -c "C: \ full-path \ to \ script.sh" у Windows 7.
Jazzepi

2
якщо це не працює, ви можете замінити -D на -n: cygrunsrv -I cron -p / usr / sbin / cron -a -D
Benlitz

2
Я використовую cygrunsrv v1.62, а '-D' не є дійсним варіантом, тому послуга негайно закривається після запуску. '-n' слід використовувати замість '-D', щоб запобігти виходу служби самостійно.
eaykin

23

порада шапки http://linux.subogero.com/894/cron-on-cygwin/

Запустіть налаштування cygwin та додайте пакет "cron" із категорії "Адміністратор".

Ми запустимо cron як послугу користувача SYSTEM. Тому погана СИСТЕМА потребує домашнього каталогу та оболонки. Файл “/ etc / passwd” визначатиме їх.

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

Запуск послуги:

$ 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

Місцеві користувачі тепер можуть визначати свої заплановані завдання, як це (crontab запустить ваш улюблений редактор):

$ 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

Користувачі домену : це не працює. Бідний cron не може виконувати заплановані завдання від імені користувачів домену на машині. Але є й інший спосіб: cron також запускає речі, знайдені в таблиці cron системного рівня в "/ etc / crontab". Тому вставте туди свій суф, щоб SYSTEM зробив це від свого імені:

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

Нарешті кілька слів про записи crontab. Це або налаштування середовища, або заплановані команди. Як було показано вище, на Cygwin найкраще створити корисну ПАТ. Домашній dir та оболонки зазвичай беруть із "/ etc / passwd".

Щодо стовпців запланованих команд, див. Сторінку керівництва.

Якщо певні записи на кронтаб не запускаються, найкращим діагностичним інструментом є такий:

$ cronevents

1
Немає підстав встановлювати CYGWIN на ntsec. Це застаріло. cygwin.com/cygwin-ug-net/using-cygwinenv.html
yam655

Як ви запускаєте Cygwin як SYSTEM?
niken

Хоча ми використовуємо cygwin sshd з аутентифікацією реклами, мені не вдалося змусити cron працювати аналогічно або з passwd -R. Єдиний спосіб, який він працював для мене, - це запустити cron як службу для призначеного користувача та виконувати всі завдання cron з цим користувачем. (Cygwin 2.8.0)
MortenB

7

Просто хотілося додати, що параметри крона, схоже, змінилися. Потрібно пройти -n, а не -D.

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

3

Застосував інструкції з цієї відповіді, і це спрацювало. Просто для того, щоб вказати на більш копіювальну пасту, як відповідь (адже процедура встановлення cygwin є різновидом реалізованої мудрої функції
антикопіювання та вставки). Натисніть кнопку WinLogo, введіть cmd.exe, клацніть правою кнопкою миші та виберіть " Запустити як адміністратор ". У рядку 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%

Переконайтеся, що інсталятор не видає жодних помилок у запиті ... Якщо він є - у вас, ймовірно, працює кілька файлів cygwin, або ви не адміністратор Windows, або якась химерна помилка ...

Тепер у cmd promt:

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

або будь-який повний шлях до файлу, який, можливо, доведеться до cygrunsrv.exe і запустити cron як службу Windows у cmd-запиту

 net start cron

Зараз у терміналі bash запустіть crontab -e

налаштуйте вам запис крону нижче, наприклад:

        #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 не працював, мені довелося встановлювати їх окремо. Тримав отримання "cygrunsrv: Даний шлях не вказує на дійсний виконуваний файл"
пограбувати

Сервіс не запускається, але, переглядаючи /var/log/cron.log, показав, що -D має бути -n. Запуск "c: \ cygwin64 \ bin \ cygrunsrv.exe -R cron", а потім "c: \ cygwin64 \ bin \ cygrunsrv.exe -I cron -p / usr / sbin / cron -a -n" виправлено це.
пограбувати

1
cygrunsrv: Помилка встановлення послуги: OpenSCManager: Помилка Win32 5: Доступ заборонено.
niken

3

Я зрозумів, як автоматично запустити службу Cygwin cron, коли я ввійшов у Windows 7. Ось що для мене спрацювало:

Використовуючи Блокнот, створіть файл C:\cygwin\bin\Cygwin_launch_crontab_service_input.txtіз вмістом noу першому рядку та yesу другому рядку (без лапок). Це ваші дві відповіді на запити для cron-config.

Створіть файл C:\cygwin\Cygwin_launch_crontab_service.batіз вмістом:

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

Додайте ярлик до наступної у папці запуску Windows: Cygwin_launch_crontab_service.bat

Дивіться http://www.sevenforums.com/tutorials/1401-startup-programs-change.html, якщо вам потрібна допомога щодо додавання до запуску. BTW, ви можете додатково додати їх до запуску, якщо хочете:

Сігвін

Сервер XWin

Перший виконує

C:\cygwin\Cygwin.bat

а другий виконує

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

1

Правильний синтаксис для встановлення cron в cygwin як службу Windows - передавати -n як аргумент, а не -D :

cygrunsrv --встановити cron - шлях / usr / sbin / cron --args -n

-D повертає помилку використання під час запуску cron у cygwin:

$

$ cygrunsrv --встановити cron - шлях / usr / sbin / cron --args -D

$ cygrunsrv - стартовий крон

cygrunsrv: Помилка запуску послуги: QueryServiceStatus: Помилка Win32 1062:

Служба не була запущена.

$ cat /var/log/cron.log

cron: невідомий варіант - D

використання: / usr / sbin / cron [-n] [-x [ext, sch, proc, parc, load, misc, test, bit]]

$

Нижче на сторінці є гарне пояснення.

Встановлення та налаштування служби Cygwin Cron у Windows: https://www.davidjnice.com/cygwin_cron_service.html

PS Мені довелося запустити Cygwin64 Terminal на своєму ПК з Windows 10 як адміністратор, щоб встановити cron як службу 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.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.