如何在Windows的Cygwin中运行crontab?


98

某些cygwin命令是.exe文件,因此您可以使用标准Windows Scheduler运行它们,但其他命令没有.exe扩展名,因此无法从DOS运行(看起来像)。

例如,我想updatedb每晚跑步。

我如何使Cron工作?

Answers:


91

您还需要安装,cygrunsrv以便可以将cron设置为Windows服务,然后运行cron-config

如果您希望cron作业发送任何输出的电子邮件,则还需要安装eximssmtp(在运行之前cron-config)。

请参阅/usr/share/doc/Cygwin/cron-*.README以获取更多详细信息。

对于没有.exe扩展名的程序,它们可能是某种类型的Shell脚本。如果您查看文件的第一行,则可以看到运行它们所需的程序(例如“ #!/bin/sh”),因此您可以通过调用Shell程序(例如“ ”)从Windows调度程序中执行它们C:\cygwin\bin\sh.exe -l /my/cygwin/path/to/prog。 )


1
请注意,即使您告诉它不要使用其他帐户,它仍然会使用seteuid(或其他方式),并且can't switch user context即使明确提出不使用其他帐户的请求,也会因含糊和矛盾而失败。在cygwin上使用cron进行帐户切换显然是必须的。您必须对以自己的身份运行说不...
2015年

cygwin的cron的-n选项同样毫无意义,无论所有事件都进入Windows事件日志。cygwin / cron方面的可怕和欺骗性文档。
user3338098 2015年

1
提示:使用cronevents命令查看事件(从Windows Evengs日志)。他们永远不会被丢弃,我会每隔几个月修剪一下原木。
Gene Pavlovsky

有关如何解决setuid问题的信息,这里有一些扩展文档:davidjnice.com/cygwin_cron_service.html
HolgerBöhnke,

71

您有两种选择:

  1. 使用cygrunsrv将cron安装为Windows服务:

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

    注意,在(非常旧的)cron版本中,您需要使用-D而不是-n

  2. “ .exe”文件可能是bash脚本,因此您可以通过Windows调度程序调用bash运行脚本来运行它们,例如:

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

3
我特别喜欢bash.exe方法。谢谢。
barrypicker 2011年

4
顺便说一句,我需要将路径指定为Unix样式的路径-对于updateb,使用Windows Task Scheduler计划的整个命令看起来像是... c:\ cygwin \ bin \ bash.exe -l -c“ / usr / bin /
Updatedb

2
我绝对推荐此答案中的方法。我能够在Windows 7上使用C:\ cygwin \ bin \ bash.exe -l -c“ C:\ full-path \ to \ script.sh”
Jazzepi 2012年

2
如果这不起作用,则可能需要用-n替换-D: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,然后从“ Admin”类别中添加“ cron”软件包。

我们将由用户SYSTEM将cron作为服务运行。因此,较差的SYSTEM需要一个主目录和一个Shell。“ / 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”中系统级cron表中的内容。因此,请在此处插入您的密码,以便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

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

只是想补充一点,cron的选项似乎已更改。需要传递-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可能具有的完整文件路径,然后在cmd提示符下将cron作为Windows服务启动

 net start cron

现在重终端中运行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

设置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

我想出了如何在登录Windows 7时自动运行Cygwin cron服务的方法。这对我有用:

使用记事本,创建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如果您需要有关如何添加到启动的帮助,。顺便说一句,如果需要,您可以选择在启动中添加这些:

西格温

XWin服务器

第一个执行

C:\cygwin\Cygwin.bat

第二个执行

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

1

在cygwin中将cron安装为Windows服务的正确语法是将-n作为参数而不是-D传递:

cygrunsrv-安装cron-路径/ usr / sbin / cron --args -n

在cygwin中启动 cron -D返回使用错误:

$

$ cygrunsrv-安装cron-路径/ usr / sbin / cron --args -D

$ cygrunsrv-启动cron

cygrunsrv:启动服务时出错:QueryServiceStatus:Win32错误1062:

该服务尚未启动。

$猫/var/log/cron.log

cron:未知选项-D

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

$

下面的页面有一个很好的解释。

在Windows中安装和配置Cygwin Cron服务:https//www.davidjnice.com/cygwin_cron_service.html

PS我必须以管理员身份在Windows 10 PC上运行Cygwin64 Terminal,才能将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.
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.