.NET CoreのアプリをLinuxのcronを使いバッチでスケジュール実行させる(CentOS7)


はじめに

.NET Core のコンソールアプリケーションを作成していれば、Linux のバッチ処理も .NET Core で書きたくなると思います。それも、スケジュール実行ができるとなおよいですね。

この記事では、.NET Core のコンソールアプリケーションを Linux の cron を使用してスケジュール実行させる方法をご紹介します。

なお、開発環境は Mac (macOS High Sierra 10.13.3) 、 .NET Core SDK 2.1.4、Visual Studio Codeで、実行環境は Vagrant で構築した CentOS 7 になります。

.NET Core コンソールアプリケーションの作成

まずは、.NET Core のコンソールアプリケーションを作成します。

内容は単純で、コンソールアプリケーションを実行したら、指定ファイルに日時を出力するものになります。

では、.NET Core のコンソールアプリケーションを以下のコマンドで作成します。

$ dotnet new console -o FileWrite

プロジェクトが作成されたら、Program.cs を以下のように変更します。

using System;
using System.IO;
using System.Text;

//(中略)

    static void Main(string[] args)
    {
        using (var file = new FileStream("/home/vagrant/output.txt", FileMode.Append))
        using (var writer = new StreamWriter(file, Encoding.UTF8))
        {
            DateTime dt = DateTime.Now;
            writer.WriteLine(dt.ToString("F"));
        }
    }

ファイルの出力先を Linux の環境に合わせています。

デプロイ

これで準備が整ったので、プロジェクトのカレントディレクトリ(.csprojがあるディレクトリ)で、以下のコマンドを実行してデプロイ用のファイルを作成します。

$ dotnet publish --configuration Release
.NET Core 向け Microsoft (R) Build Engine バージョン 15.5.180.51428
Copyright (C) Microsoft Corporation.All rights reserved.

  Restore completed in 37.33 ms for /Users/xxx/Projects/FileWrite/FileWrite.csproj.
  FileWrite -> /Users/xxx/Projects/FileWrite/bin/Release/netcoreapp2.0/FileWrite.dll
  FileWrite -> /Users/xxx/Projects/FileWrite/bin/Release/netcoreapp2.0/publish/

ディレクトリを移動して配布ファイルを圧縮します。

$ cd bin/Release/netcoreapp2.0/publish/
$ tar zcvf deploy.tar.gz *

できあがった deploy.tar.gz を Linux の /home/vagrant に SFTP ソフトを使用してアップロードします。

アップロードが完了したら、Linux に vagrant ユーザーでログインして、以下のコマンドで圧縮ファイルを解凍します。

$ tar zxvf deploy.tar.gz

これでデプロイは終了です。

cron の設定

dotnet FileWrite.dll と実行することで .NET Core のコンソールアプリケーションを実行することができるのですが、これを cron で10秒ごとに実行するように設定します。

以下のように crontab を開きます。

$ sudo crontab -u vagrant -e

そして以下のように設定します。これで10秒ごとにコマンドを実行できます。詳しくは参考サイトを参照してください。

* * * * * for i in `seq 0 10 59`;do (sleep ${i}; dotnet FileWrite.dll ) & done;

crontab の内容を保存しても、なにも起きないかもしれません。その場合は、cron のサービスが止まっている可能性があります。以下のように cron のサービスを起動してください。

$ sudo systemctl start crond

ls コマンドを実行してみると output.txt が作成されているのが分かります。

$ ls
deploy.tar.gz        FileWrite.dll  FileWrite.runtimeconfig.json
FileWrite.deps.json  FileWrite.pdb  output.txt

また、cat コマンドを実行すると、output.txt ファイルに日時が正しく出力されていることも確認できました。

$ cat output.txt
Saturday, March 17, 2018 2:26:01 PM
Saturday, March 17, 2018 2:26:11 PM
Saturday, March 17, 2018 2:27:01 PM
Saturday, March 17, 2018 2:27:11 PM
Saturday, March 17, 2018 2:29:01 PM
Saturday, March 17, 2018 2:29:11 PM
Saturday, March 17, 2018 2:29:21 PM
Saturday, March 17, 2018 2:29:31 PM
Saturday, March 17, 2018 2:29:41 PM
Saturday, March 17, 2018 2:29:51 PM

これで .NET Core で作成したコンソールアプリケーションを cron を使いバッチ処理でスケジュール実行できることが分かりました。

このまま放っておくとファイルに延々と出力されてしまうので、crontab の内容を削除しておいてください。

おわりに

.NET Core のコンソールアプリケーションを Linux でスケジュール実行するのは、やり方が分かれば意外と簡単です。

バッチ処理をシェルで作成するのもよいですが、折角なので .NET Core のコンソールアプリケーションも活用していきたいですね。

参考サイト