คุณเรียกใช้ crontab ใน Cygwin บน Windows ได้อย่างไร


98

คำสั่ง cygwin บางคำสั่งเป็น.exeไฟล์ดังนั้นคุณสามารถเรียกใช้ด้วย Windows Scheduler มาตรฐานได้ แต่คำสั่งอื่น ๆ ไม่มี.exeส่วนขยายจึงไม่สามารถเรียกใช้จาก DOS ได้ (ดูเหมือนว่า)

ตัวอย่างเช่นฉันต้องการupdatedbวิ่งทุกคืน

ฉันจะทำให้ cron ทำงานได้อย่างไร

คำตอบ:


91

คุณจำเป็นต้องติดตั้งcygrunsrvเพื่อให้คุณสามารถตั้ง cron 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 ถือเป็นเรื่องจำเป็น คุณต้องพูดว่า NO เพื่อทำงานในฐานะตัวเอง ...
user3338098

และตัวเลือก -n ของ cron ของ cygwin ก็ไม่มีความหมายเท่ากันไม่ว่าเหตุการณ์ทั้งหมดจะไปที่บันทึกเหตุการณ์ของ windows เอกสารที่น่ากลัวและหลอกลวงในส่วนของ cygwin / cron
user3338098

1
เคล็ดลับ: ใช้croneventsคำสั่งเพื่อดูเหตุการณ์ (จากบันทึก windows evengs) พวกเขาจะไม่ถูกทิ้งฉันจะตัดท่อนไม้ทุกๆสองสามเดือน
Gene Pavlovsky

มีเอกสารเพิ่มเติมเกี่ยวกับวิธีแก้ไขปัญหา 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 script ดังนั้นคุณสามารถเรียกใช้ผ่านตัวกำหนดตารางเวลาของ windows โดยเรียกใช้ bash เพื่อรันสคริปต์เช่น:

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

3
ฉันชอบวิธี bash.exe เป็นพิเศษ ขอบคุณ.
barrypicker

4
BTW ฉันต้องการระบุเส้นทางเป็นพา ธ สไตล์ยูนิกซ์ - สำหรับ updatedb คำสั่งทั้งหมดของฉันที่กำหนดเวลาด้วยตัวกำหนดตารางงานของ 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

24

เคล็ดลับหมวก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 ควรสร้าง PATH ที่ใช้งานได้ดีที่สุด โดยปกติ dir และเปลือกบ้านจะนำมาจาก“ / 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 และเริ่มบริการ cron เป็น windows ในพรอมต์ cmd

 net start cron

ตอนนี้ในbash terminal ให้รัน 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: เส้นทางที่ระบุไม่ได้ชี้ไปที่ปฏิบัติการที่ถูกต้อง"
ปล้น

บริการจะไม่เริ่ม แต่เมื่อดูใน /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 นี่คือสิ่งที่ใช้ได้ผลสำหรับฉัน:

ใช้ Notepad สร้างไฟล์ที่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 Startup: Cygwin_launch_crontab_service.bat

โปรดดูที่http://www.sevenforums.com/tutorials/1401-startup-programs-change.htmlหากคุณต้องการความช่วยเหลือเกี่ยวกับวิธีเพิ่มใน Startup BTW คุณสามารถเลือกเพิ่มสิ่งเหล่านี้ใน 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 - ติดตั้ง cron --path / usr / sbin / cron --args -n

-Dส่งกลับข้อผิดพลาดในการใช้งานเมื่อเริ่ม cronใน cygwin:

$

$ cygrunsrv - ติดตั้ง cron --path / usr / sbin / cron --args -D

$ cygrunsrv - เริ่มต้น cron

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

ป.ล.ฉันต้องเรียกใช้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.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.