Как запустить crontab в Cygwin в Windows?

98

Некоторые команды cygwin представляют собой .exeфайлы, поэтому вы можете запускать их со стандартным планировщиком Windows, но другие не имеют .exeрасширения, поэтому их нельзя запускать из DOS (похоже).

Например, я хочу updatedbбегать по ночам.

Как заставить работать cron?

user10306
источник

Ответы:

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даже если явный запрос был сделан НЕ на использование других учетных записей. Переключение учетной записи с cron на cygwin, по-видимому, ОБЯЗАТЕЛЬНО. Вы должны сказать НЕТ бегу от себя ...
user3338098
и опция -n cron cygwin одинаково бессмысленна, независимо от того, какие все события попадают в журнал событий Windows. ужасная и обманчивая документация по cygwin / cron.
user3338098
1
Совет: используйте croneventsкоманду для просмотра событий (из журнала событий Windows). Их никогда не выбрасывают, я бы обрезал поленья каждые несколько месяцев.
Гена Павловский
Здесь есть несколько расширенных документов о том, как обойти проблему с setuid: 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', вероятно, являются сценариями bash, поэтому вы можете запустить их через планировщик Windows, вызвав bash для запуска сценария, например:

    C:\cygwin\bin\bash.exe -l -c "./full-path/to/script.sh"
    
Edoloughlin
источник
3
Особенно мне понравился метод bash.exe. Спасибо.
barrypicker
4
Кстати, мне нужно было указать путь как путь в стиле 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-setup и добавьте пакет «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 лучше всего создать пригодный для использования PATH. Домашний каталог и оболочка обычно берутся из «/ etc / passwd».

Что касается столбцов запланированных команд, см. Страницу руководства.

Если определенные записи crontab не запускаются, лучший диагностический инструмент - это:

$ cronevents
Rhoracio
источник
1
Нет причин устанавливать для CYGWIN значение ntsec. Это устарело. cygwin.com/cygwin-ug-net/using-cygwinenv.html
yam655
Как запустить Cygwin как СИСТЕМУ?
niken
Хотя мы используем cygwin sshd с рекламной аутентификацией, мне не удалось заставить cron работать таким же образом или с passwd -R. Единственный способ, которым это сработало для меня, - запустить cron как службу для определенного пользователя и выполнять все задания cron с этим пользователем. (Cygwin 2.8.0)
MortenB
7

Просто хотел добавить, что параметры cron, похоже, изменились. Необходимо использовать -n вместо -D.

cygrunsrv -I cron -p /usr/sbin/cron -a -n
Рег Уиттон
источник
3

Применил инструкции из этого ответа, и это сработало. Просто чтобы указать на более
точную копию, например, ответ (поскольку процедура установки cygwin является своего рода реализацией защиты от копирования и вставки). Нажмите кнопку WinLogo, введите cmd.exe, щелкните его правой кнопкой мыши, выберите " Начать как администратор ». В командной строке:

 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 в командной строке

 net start cron

Теперь в терминале bash запустите crontab -e

настройте запись в cron, как показано ниже:

        #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: указанный путь не указывает на допустимый исполняемый файл»
rob
Служба не запускалась, но просмотр /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, если вам нужна помощь по добавлению в Startup. Кстати, вы можете при желании добавить их в автозагрузку, если хотите:

Cygwin

Сервер 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 --install cron --path / usr / sbin / cron --args -n

-D возвращает ошибку использования при запуске cron в cygwin:

$

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

$ cygrunsrv - запустить cron

cygrunsrv: ошибка запуска службы: QueryServiceStatus: ошибка Win32 1062:

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

$ cat /var/log/cron.log

cron: unknown option - 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.
Гарри Рокфеллер
источник