Windows의 Cygwin에서 crontab을 어떻게 실행합니까?


98

일부 cygwin 명령은 .exe파일이므로 표준 Windows 스케줄러로 실행할 수 있지만 다른 명령에는.exe 확장자가 없으므로 DOS에서 실행할 수 없습니다 (처럼 보입니다).

예를 들어 updatedb 밤마다 달리고 .

크론은 어떻게 작동합니까?

답변:


91

또한 설치해야 cygrunsrvcron을 Windows 서비스로 설정 한 다음 실행할 수 있습니다.cron-config .

크론 작업이 출력의 이메일을 보내도록하려면 exim또는 ssmtp(실행하기 전에) 중 하나를 설치해야합니다 cron-config.

자세한 내용은를 참조 /usr/share/doc/Cygwin/cron-*.README하십시오.

.exe확장 프로그램이없는 프로그램 은 아마도 어떤 유형의 쉘 스크립트 일 것입니다. 파일의 첫 번째 줄을 보면 파일을 실행하는 데 사용해야하는 프로그램 (예 : " #!/bin/sh")을 알 수 있으므로 셸 프로그램 (예 : " C:\cygwin\bin\sh.exe -l /my/cygwin/path/to/prog") 을 호출하여 Windows 스케줄러에서 실행할 수 있습니다 . )


1
다른 계정을 사용하지 말라고 말하더라도 다른 계정을 사용하지 말라고 can't switch user context명시 적으로 요청 했음에도 불구하고 seteuid (또는 다른 것)를 사용하고 모순적이고 모순적으로 실패 합니다. cygwin에서 cron으로 계정을 전환하는 것은 분명히 필수입니다. 자신으로 달리기를
거부

그리고 cygwin의 cron의 -n 옵션은 모든 이벤트가 Windows 이벤트 로그로 이동하는 것과 상관없이 똑같이 의미가 없습니다. cygwin / cron 부분에 대한 끔찍하고기만적인 문서.
user3338098 2015

1
팁 : cronevents명령을 사용 하여 이벤트를보십시오 (windows evengs 로그에서). 그들은 결코 버려지지 않으며 몇 달에 한 번씩 통나무를 정리합니다.
Gene Pavlovsky

일부 확장 된 워드 프로세서에, 여기있다 setuid를 문제를 해결하는 방법을 : davidjnice.com/cygwin_cron_service.html
홀거 Böhnke

71

두 가지 옵션이 있습니다.

  1. cygrunsrv를 사용하여 cron을 Windows 서비스로 설치합니다.

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

    (아주) 오래된 버전의 cron에서는 -n 대신 -D를 사용해야합니다.

  2. 'non .exe'파일은 아마도 bash 스크립트 일 것이므로 bash를 호출하여 스크립트를 실행하여 Windows 스케줄러를 통해 실행할 수 있습니다. 예 :

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

3
나는 특히 bash.exe 방법을 좋아했습니다. 감사.
barrypicker 2011

4
BTW, 유닉스 스타일 경로로 경로를 지정해야했습니다. 업데이트 된 경우 Windows 작업 스케줄러로 예약 된 전체 명령은 다음과 같습니다. c : \ cygwin \ bin \ bash.exe -l -c "/ usr / bin / updatedb "
barrypicker 2011

2
이 답변의 방법을 확실히 추천합니다. Windows 7에서 C : \ cygwin \ bin \ bash.exe -l -c "C : \ full-path \ to \ script.sh"를 사용할 수있었습니다.
Jazzepi

2
이것이 작동하지 않으면 -D를 -n으로 대체 할 수 있습니다. cygrunsrv -I cron -p / usr / sbin / cron -a -D
Benlitz 2013

2
cygrunsrv v1.62를 사용하고 있으며 '-D'는 유효한 옵션이 아니므로 서비스가 시작된 후 즉시 종료됩니다. 서비스가 자체적으로 종료되는 것을 방지하려면 '-D'대신 '-n'을 사용해야합니다.
eaykin 2015-04-15

23

모자 팁 http://linux.subogero.com/894/cron-on-cygwin/

cygwin-setup을 시작하고 "Admin"범주에서 "cron"패키지를 추가합니다.

SYSTEM 사용자가 cron을 서비스로 실행합니다. 따라서 불량 시스템에는 홈 디렉토리와 쉘이 필요합니다. "/ 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에서는 사용 가능한 PATH를 만드는 것이 가장 좋습니다. 홈 디렉토리와 쉘은 일반적으로“/ etc / passwd”에서 가져옵니다.

예약 된 명령 열에 대해서는 매뉴얼 페이지를 참조하십시오.

특정 crontab 항목이 실행되지 않는 경우 가장 좋은 진단 도구는 다음과 같습니다.

$ cronevents

1
CYGWIN을 ntsec로 설정할 이유가 없습니다. 구식입니다. cygwin.com/cygwin-ug-net/using-cygwinenv.html
yam655 2011

Cygwin을 SYSTEM으로 어떻게 실행합니까?
niken

광고 인증과 함께 cygwin sshd를 사용했지만 동일한 방식으로 또는 passwd -R을 사용하여 cron이 작동하지 못했습니다. 나를 위해 일한 유일한 방법은 지정된 사용자에 대한 서비스로 cron을 실행 하고이 사용자와 모든 cron 작업을 수행하는 것입니다. (Cygwin 2.8.0)
MortenB

7

cron에 대한 옵션이 변경된 것처럼 추가하고 싶었습니다. -D가 아닌 -n을 전달해야합니다.

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

3

이 답변 의 지침을 적용하고 답변 과 같은 더 많은 복사 붙여 넣기를 지적하기 위해 작동
했습니다. 관리자로 시작 ". 에서는 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

이제 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"을 실행하면 문제가 해결되었습니다.
rob

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

보다 Startup에 추가하는 방법에 대한 도움이 필요하면 http://www.sevenforums.com/tutorials/1401-startup-programs-change.html을 하십시오 . BTW, 원하는 경우 Startup에서 선택적으로 추가 할 수 있습니다.

Cygwin

XWin 서버

첫 번째 실행

C:\cygwin\Cygwin.bat

두 번째는

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

1

cygwin에 Windows 서비스로 cron 을 설치하는 올바른 구문 은 -D가 아닌 -n 을 인수 로 전달하는 것입니다. .

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 : 알 수없는 옵션-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

추신 : cron 을 Windows 서비스 로 설치하려면 Windows 10 PC에서 Cygwin64 Terminal 을 관리자로 실행해야 했습니다.


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.