English 中文(简体)
你如何在Windows的Cygwin中运行一个crontab?
原标题:
  • 时间:2009-04-01 20:20:49
  •  标签:

一些Cygwin命令是.exe文件,因此您可以使用标准的Windows调度程序运行它们,但其他命令没有.exe扩展名,因此无法从DOS中运行(似乎是这样)。

例如,我希望每晚运行updatedb

我如何使 cron 工作?

最佳回答

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

如果您想让cron作业发送任何输出的电子邮件,您还需要在运行cron-config之前安装eximssmtp

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

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

问题回答

你有两个选项:

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

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

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

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

    C:cygwininash.exe -l -c "./full-path/to/script.sh"
    

这是一条提示:http://linux.subogero.com/894/cron-on-cygwin/

启动cygwin安装程序,并从“管理”类别中添加 “cron” 软件。

我们将以USER 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也运行“/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中最好创建一个可用的路径。主目录和shell通常来自“/etc/passwd”。

关于预定命令的列,请参阅手册页。

如果某些crontab条目未运行,则最好的诊断工具是:

$ cronevents

只是想补充一下,Cron的选项似乎已经改变。现在需要传递-n而不是-D。

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

Applied the instructions from this answer and it worked Just to point out a more copy paste like answer ( because cygwin installation procedure is kind of anti-copy-paste wise implemented )
Click WinLogo button , type cmd.exe , right click it , choose "Start As Administrator". In cmd prompt:

 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管理员,或者一些奇怪的bug...

现在在cmd提示符中:

 C:cygwin64incygrunsrv.exe -I cron -p /usr/sbin/cron -a -D   

or whatever full file path you might have to the cygrunsrv.exe and start the cron as windows service in the cmd prompt

 net start cron

Now in bash terminal run 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

我找到了如何在Windows 7登录时自动启动Cygwin: Cygwin计划任务服务的方法。以下是我成功使用的步骤:

使用记事本创建文件C:cygwin \ inCygwin: Cygwin_launch_crontab_service_input.txt,第一行内容为no,第二行内容为yes(不带引号)。这是您对提示的两个响应。

创建文件C:cygwinCygwin: Cygwin_launch_crontab_service.bat,并包含以下内容:

@echo off
C:
chdir C:cygwinin
bash  cron-config < Cygwin: Cygwin_launch_crontab_service_input.txt

Add a Shortcut to the following in the Windows Startup folder: Cygwin: Cygwin_launch_crontab_service.bat

如果您需要如何添加到启动项的帮助,请查看http://www.sevenforums.com/tutorials/1401-startup-programs-change.html。 另外,您可以选择将以下内容添加到启动项:

Cygwin: Cygwin

XWin服务器

第一个执行。

C:cygwinCygwin: Cygwin.bat

第二个执行。

C:cygwinin
un.exe /usr/bin/bash.exe -l -c /usr/bin/startxwin.exe

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

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

在Cygwin中启动cron时,-D返回使用错误。

美元符号

$ cygrunsrv --install cron --path /usr/sbin/cron --args -D $ cygrunsrv --安装 cron --路径 /usr/sbin/cron --参数 -D

$cygrunsrv --start cron $cygrunsrv --启动cron

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

服务还没有开始。

$cat /var/log/cron.log的中文翻译是:$cat /var/log/cron.log

cron:未知选项--D

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

美元符号

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

Installing & Configuring the Cygwin Cron Service in Windows: https://www.davidjnice.com/cygwin_cron_service.html

附言:我必须以管理员身份在我的Windows 10 PC上运行Cygwin64终端才能安装cron作为Windows服务。

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.




相关问题