web-dev-qa-db-ja.com

Windows上のCygwinでcrontabを実行するにはどうすればよいですか?

いくつかのcygwinコマンドは.exeファイル。標準のWindowsスケジューラで実行できますが、他のファイルには.exe拡張子なので、DOSから実行できません(どうやらそうです)。

たとえば、updatedbを毎晩実行したい。

Cronを機能させるにはどうすればよいですか?

95
user10306

CronをWindowsサービスとして設定し、cron-configを実行できるように、cygrunsrvもインストールする必要があります。

Cronジョブで出力の電子メールを送信する場合は、eximまたはssmtpをインストールする必要があります(cron-configを実行する前に)

詳細については、/usr/share/doc/Cygwin/cron-*.READMEを参照してください。

.exe拡張子のないプログラムに関しては、おそらく何らかのタイプのシェルスクリプトです。ファイルの最初の行を見ると、それらを実行するために使用する必要があるプログラム(たとえば、「#!/bin/sh」)が表示されるので、Shellプログラムを呼び出してWindowsスケジューラから実行できます(例:「C:\cygwin\bin\sh.exe -l /my/cygwin/path/to/prog」。)

89
Evan

次の2つのオプションがあります。

  1. Cygrunsrvを使用して、cronをWindowsサービスとしてインストールします。

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

    Cronの(非常に)古いバージョンでは、-nの代わりに-Dを使用する必要があることに注意してください。

  2. 「非.exe」ファイルはおそらくbashスクリプトであるため、bashを呼び出してスクリプトを実行することにより、Windowsスケジューラを介して実行できます。

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

帽子のヒント 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テーブルにあるものも実行します。そこで、suffをそこに挿入して、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
22
rhoracio

Cronのオプションが変更されたように見えることを追加したかっただけです。 -Dではなく-nを渡す必要があります。

cygrunsrv -I cron -p /usr/sbin/cron -a -n
7
Reg Whitton

Windows 7にログオンしたときにCygwinのcronサービスを自動的に実行する方法を見つけました。

メモ帳を使用して、ファイルC:\cygwin\bin\Cygwin_launch_crontab_service_input.txtを作成し、最初の行にコンテンツnoを、2行目にyesを付けます(引用符なし)。これらは、cron-configのプロンプトに対する2つの応答です。

コンテンツを含むファイル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

そして2番目のものが実行されます

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

この回答 からの指示を適用し、回答のようなコピーペーストを指摘するだけで機能しました(cygwinインストール手順は、コピー防止貼り付けのように実装されているため)
WinLogoボタンをクリックし、cmd.exeと入力して右クリックし、「管理者として起動」を選択します。 Incmdプロンプト:

 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の管理者ではないか、または奇妙なバグです...

次に、cmdpromt:

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

またはcygrunsrv.exeへの完全なファイルパスが何であれ、cmdプロンプトでWindowsサービスとしてcronを開始します

 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
3
Yordan Georgiev

インストールする正しい構文cron Windowsサービスとしてのcygwinでは-n引数ではなく-D

cygrunsrv --install cron --path/usr/sbin/cron --args -n

-D起動時に使用法エラーを返しますcron in cygwin:

$

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

$ cygrunsrv --start 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

PS実行する必要がありましたCygwin64 Terminalインストールする管理者としてWindows 10 PCでcron Windowsサービスとして。

1
Shen
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.
0