Làm cách nào để bạn chạy crontab trong Cygwin trên Windows?


98

Một số lệnh cygwin là .exetệp, vì vậy bạn có thể chạy chúng bằng Trình lập lịch chuẩn của Windows, nhưng những lệnh khác không có .exephần mở rộng nên không thể chạy từ DOS (có vẻ như).

Ví dụ tôi muốn updatedbchạy hàng đêm.

Làm cách nào để làm cho cron hoạt động?

Câu trả lời:


91

Bạn cũng cần cài đặt cygrunsrvđể có thể thiết lập cron làm dịch vụ windows, sau đó chạycron-config .

Nếu bạn muốn cron job gửi email của bất kỳ đầu ra nào, bạn cũng cần cài đặt eximhoặc ssmtp(trước khi chạy cron-config).

Xem /usr/share/doc/Cygwin/cron-*.READMEđể biết thêm chi tiết.

Về các chương trình không có .exephần mở rộng, chúng có thể là một số loại kịch bản shell. Nếu bạn nhìn vào dòng đầu tiên của tệp, bạn có thể thấy chương trình nào bạn cần sử dụng để chạy chúng (ví dụ: " #!/bin/sh"), vì vậy bạn có thể thực thi chúng từ bộ lập lịch cửa sổ bằng cách gọi chương trình shell (ví dụ: " C:\cygwin\bin\sh.exe -l /my/cygwin/path/to/prog". )


1
lưu ý rằng ngay cả khi bạn yêu cầu nó KHÔNG sử dụng các tài khoản khác, nó vẫn sẽ sử dụng seteuid (hoặc thứ gì đó) và thất bại với một điều khó hiểu và mâu thuẫn can't switch user contextmặc dù yêu cầu rõ ràng là KHÔNG sử dụng các tài khoản khác. Chuyển đổi tài khoản bằng cron trên cygwin rõ ràng là MANDATORY. Bạn phải nói KHÔNG với chạy như chính mình ...
user3338098

và tùy chọn -n của cron của cygwin cũng vô nghĩa như nhau vì không có vấn đề gì tất cả các sự kiện đi vào nhật ký sự kiện của windows. tài liệu khủng khiếp và lừa đảo về phần của cygwin / cron.
user3338098

1
Mẹo: sử dụng croneventslệnh để xem các sự kiện (từ nhật ký windows evengs). Chúng không bao giờ bị bỏ đi, tôi sẽ cắt tỉa các khúc gỗ vài tháng một lần.
Gene Pavlovsky

Có một số tài liệu mở rộng ở đây, về cách giải quyết vấn đề setuid: davidjnice.com/cygwin_cron_service.html
Holger Böhnke

71

Bạn có hai lựa chọn:

  1. Cài đặt cron làm dịch vụ windows, sử dụng cygrunsrv:

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

    Lưu ý, trong (rất) các phiên bản cron cũ, bạn cần sử dụng -D thay vì -n

  2. Các tệp 'không phải .exe' có thể là tập lệnh bash, vì vậy bạn có thể chạy chúng qua bộ lập lịch cửa sổ bằng cách gọi bash để chạy tập lệnh, ví dụ:

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

3
Tôi đặc biệt thích phương pháp bash.exe. Cảm ơn.
barrypicker

4
BTW, tôi cần chỉ định đường dẫn dưới dạng đường dẫn kiểu unix - đối với updatedb, toàn bộ lệnh của tôi được lập lịch với trình lập lịch tác vụ windows trông giống như ... c: \ cygwin \ bin \ bash.exe -l -c "/ usr / bin / cập
nhậtb

2
Tôi chắc chắn đề nghị phương pháp trong câu trả lời này. Tôi đã có thể sử dụng C: \ cygwin \ bin \ bash.exe -l -c "C: \ full-path \ to \ script.sh" trên windows 7.
Jazzepi

2
nếu điều này không hiệu quả, bạn có thể muốn thay thế -D bằng -n: cygrunsrv -I cron -p / usr / sbin / cron -a -D
Benlitz

2
Tôi đang sử dụng cygrunsrv v1.62 và '-D' không phải là một tùy chọn hợp lệ, do đó dịch vụ sẽ thoát ngay lập tức sau khi được khởi động. '-n' nên được sử dụng thay vì '-D' để ngăn dịch vụ tự thoát ra.
eaykin

23

đầu mũ http://linux.subogero.com/894/cron-on-cygwin/

Bắt đầu thiết lập cygwin và thêm gói “cron” từ danh mục “Quản trị viên”.

Chúng tôi sẽ chạy cron như một dịch vụ của người dùng SYSTEM. Hệ thống kém do đó cần một thư mục chính và một trình bao. Tệp “/ etc / passwd” sẽ xác định chúng.

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

Bắt đầu dịch vụ:

$ 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

Người dùng cục bộ hiện có thể xác định các tác vụ đã lên lịch của họ như thế này (crontab sẽ khởi động trình soạn thảo yêu thích của bạn):

$ 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

Người dùng miền : nó không hoạt động. Cron kém không thể chạy các tác vụ đã lên lịch thay mặt cho người dùng miền trên máy. Nhưng có một cách khác: cron cũng chạy những thứ được tìm thấy trong bảng cron cấp hệ thống trong “/ etc / crontab”. Vì vậy, hãy chèn tên của bạn vào đó, để SYSTEM thực hiện việc đó thay mặt cho chính nó:

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

Cuối cùng là một vài lời về mục crontab. Chúng là cài đặt môi trường hoặc lệnh được lập lịch. Như đã thấy ở trên, trên Cygwin, tốt nhất bạn nên tạo một PATH có thể sử dụng được. Home dir và shell thường được lấy từ “/ etc / passwd”.

Đối với các cột của lệnh đã lập lịch, hãy xem trang hướng dẫn.

Nếu một số mục crontab nhất định không chạy, công cụ chẩn đoán tốt nhất là:

$ cronevents

1
Không có lý do gì để đặt CYGWIN thành ntsec. Nó đã lỗi thời. cygwin.com/cygwin-ug-net/using-cygwinenv.html
yam655

Làm cách nào để bạn chạy Cygwin dưới dạng HỆ THỐNG?
niken

Mặc dù chúng tôi sử dụng cygwin sshd với xác thực quảng cáo, nhưng tôi không thể làm cho cron hoạt động theo cách tương tự hoặc với passwd -R. Cách duy nhất nó hoạt động với tôi là chạy cron như một dịch vụ cho một người dùng được chỉ định và thực hiện tất cả các công việc cron với người dùng này. (Cygwin 2.8.0)
MortenB

7

Chỉ muốn thêm rằng các tùy chọn cho cron dường như đã thay đổi. Cần phải vượt qua -n hơn là -D.

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

3

Đã áp dụng các hướng dẫn từ câu trả lời này và nó hoạt động Chỉ để chỉ ra một bản sao chép dán giống như câu trả lời (vì quy trình cài đặt cygwin là loại chống sao chép-dán được triển khai khôn ngoan)
Nhấp vào nút WinLogo, gõ cmd.exe, nhấp chuột phải vào nó, chọn " Bắt đầu với tư cách quản trị viên ". Trong lời nhắc 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%

Đảm bảo trình cài đặt không xuất hiện bất kỳ lỗi nào trong lời nhắc ... Nếu có - có thể bạn đang chạy một số tệp nhị phân cygwin hoặc bạn không phải là quản trị viên Windows hoặc một số lỗi kỳ lạ ...

Bây giờ trong quảng cáo cmd :

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

hoặc bất kỳ đường dẫn tệp đầy đủ nào bạn có thể có tới cygrunsrv.exe và khởi động dịch vụ cron as windows trong dấu nhắc cmd

 net start cron

Bây giờ trong thiết bị đầu cuối bash chạy crontab -e

thiết lập mục nhập cron của bạn một ví dụ dưới đây:

        #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

đặt package_name = cygrunsrv cron không hoạt động, tôi phải cài đặt chúng riêng. Vẫn nhận được "cygrunsrv: Đường dẫn đã cho không trỏ đến tệp thực thi hợp lệ"
cướp

Dịch vụ sẽ không bắt đầu nhưng nhìn trong /var/log/cron.log cho thấy rằng -D nên là -n. Chạy "c: \ cygwin64 \ bin \ cygrunsrv.exe -R cron" và sau đó "c: \ cygwin64 \ bin \ cygrunsrv.exe -I cron -p / usr / sbin / cron -a -n" đã sửa nó.
cướp

1
cygrunsrv: Lỗi cài đặt dịch vụ: OpenSCManager: Win32 lỗi 5: Quyền truy cập bị từ chối.
niken

3

Tôi đã tìm ra cách để dịch vụ Cygwin cron tự động chạy khi tôi đăng nhập vào Windows 7. Đây là những gì phù hợp với tôi:

Sử dụng Notepad, tạo tệp C:\cygwin\bin\Cygwin_launch_crontab_service_input.txtcó nội dung notrên dòng đầu tiên và yestrên dòng thứ hai (không có dấu ngoặc kép). Đây là hai câu trả lời của bạn cho lời nhắccron-config .

Tạo tệp C:\cygwin\Cygwin_launch_crontab_service.batvới nội dung:

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

Thêm Lối tắt vào phần sau trong thư mục Khởi động Windows: Cygwin_launch_crontab_service.bat

Xem http://www.sevenforums.com/tutorials/1401-startup-programs-change.html nếu bạn cần trợ giúp về cách thêm vào Startup. BTW, bạn có thể tùy chọn thêm những thứ này trong Startup nếu bạn muốn:

Cygwin

Máy chủ XWin

Cái đầu tiên thực thi

C:\cygwin\Cygwin.bat

và cái thứ hai thực thi

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

1

Cú pháp chính xác để cài đặt cron trong cygwin dưới dạng dịch vụ Windows là chuyển -n làm đối số chứ không phải -D :

cygrunsrv - cài đặt cron --path / usr / sbin / cron --args -n

-D trả về lỗi sử dụng khi khởi động cron trong cygwin:

$

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

$ cygrunsrv --start cron

cygrunsrv: Lỗi khi khởi động dịch vụ: QueryServiceStatus: Win32 error 1062:

Dịch vụ chưa được bắt đầu.

$ cat /var/log/cron.log

cron: tùy chọn không xác định - D

cách sử dụng: / usr / sbin / cron [-n] [-x [ext, sch, proc, parc, load, misc, test, bit]]

$

Dưới đây trang có một lời giải thích tốt.

Cài đặt & Định cấu hình Dịch vụ Cygwin Cron trong Windows: https://www.davidjnice.com/cygwin_cron_service.html

PS Tôi đã phải chạy Cygwin64 Terminal trên PC Windows 10 của mình với tư cách quản trị viên để cài đặt cron dưới dạng dịch vụ 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.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.