はじめに
.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 のコンソールアプリケーションも活用していきたいですね。