WindowsのCygwinでcrontabをどのように実行しますか?


98

一部のcygwinコマンドは.exeファイルであるため、標準のWindowsスケジューラで実行できますが、他のコマンドには.exe拡張子がないため、DOSから実行できません(そのように見えます)。

例えば、updatedb毎晩走りたいです。

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

回答:


91

またcygrunsrv、cronをWindowsサービスとして設定してを実行できるように、インストールする必要があります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
他のアカウントを使用しないように指定した場合can't switch user contextでも、他のアカウントを使用しないように明示的に要求されたとしても、seteuid(または何か)が使用され、不可解で矛盾して失敗することに注意してください。cygwinでのcronによるアカウント切り替えは明らかに必須です。自分で実行する場合は、NOと言う必要があります...
user3338098

また、cygwinのcronの-nオプションは、すべてのイベントがWindowsのイベントログに記録されるかどうかに関係なく、同様に無意味です。cygwin / cronの部分についてのひどくて欺瞞的な文書。
user3338098 2015

1
ヒント:croneventsコマンドを使用して、イベントを表示します(Windowsイベントログから)。それらは決して廃棄されません、私は数か月ごとにログを剪定します。
Gene Pavlovsky、

setuidの問題を回避する方法についての拡張ドキュメントがいくつかあります:davidjnice.com/cygwin_cron_service.html
HolgerBöhnkeApr

71

次の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"
    

3
特にbash.exeメソッドが気に入りました。ありがとう。
barrypicker

4
ところで、UNIXスタイルのパスとしてパスを指定する必要がありました-updatedbの場合、Windowsタスクスケジューラでスケジュールされたコマンド全体は次のようになります... c:\ cygwin \ bin \ bash.exe -l -c "/ usr / bin / updatedb "
barrypicker

2
私は間違いなくこの回答の方法をお勧めします。私はCを使用することができました:\ cygwinの\ binに\ bash.exe -l -c:Windows上の"C script.sh \へ\フルパス\" 7
Jazzepi

2
これが機能しない場合は、-Dを-nに置き換えます。cygrunsrv-I cron -p / usr / sbin / cron -a -D
Benlitz

2
私はcygrunsrv v1.62を使用していますが、「-D」は有効なオプションではないため、サービスは開始後すぐに終了します。サービスが単独で終了しないようにするには、「-D」の代わりに「-n」を使用する必要があります。
eaykin 2015

23

ハットチップhttp://linux.subogero.com/894/cron-on-cygwin/

cygwin-setupを起動し、「Admin」カテゴリから「cron」パッケージを追加します。

ユーザーSYSTEMによってサービスとして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は、「/ 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

システムとしてCygwinをどのように実行しますか?
niken

広告認証でcygwin sshdを使用していますが、同じように、またはpasswd -Rでcronを機能させることができませんでした。私にとってそれが機能した唯一の方法は、指定されたユーザーのサービスとしてcronを実行し、このユーザーですべてのcronジョブを実行することでした。(Cygwin 2.8.0)
MortenB 2017年

7

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

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への完全なファイルパスと、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

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」を実行すると修正されました。
ロブ

1
cygrunsrv:サービスのインストールエラー:OpenSCManager:Win32エラー5:アクセスが拒否されました。
niken

3

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

メモ帳を使用して、1行目と2行目(引用符なし)のC:\cygwin\bin\Cygwin_launch_crontab_service_input.txtコンテンツを含むファイルを作成します。これらは、のプロンプトに対する2つの応答です。noyescron-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

スタートアップに追加する方法についてヘルプが必要な場合は、http://www.sevenforums.com/tutorials/1401-startup-programs-change.htmlを参照してください。ところで、必要に応じて、これらをスタートアップにオプションで追加できます。

Cygwin

XWinサーバー

最初のものは実行します

C:\cygwin\Cygwin.bat

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

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

1

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

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

-Dは、cygwinで cronを起動すると使用法エラーを返します。

ドル

$ 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

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


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.