アプリ版:「スタンプのみでお礼する」機能のリリースについて

linuxサーバーAのあるディレクトリから、別のlinuxサーバーBのあるディレクトリに、サーバーA内に一定間隔で入ってくるデータファイルを一定間隔でコピーし続けたいと思っています。
サーバーAには、一日中毎に観測データファイル(20230826.rawなど)が作成され、30秒毎にその日のファイル内のデータが一行ずつ追記されていきます。このファイルを、1分間隔でAからBにコピーし続けたいです。同じ日付であれば、中身だけ増えていくので、同じファイルのものは上書きなどの処理にしたいです。
また、その際に、サーバーAのデータをそのままコピーするのではなく、以下2点の変換をしたものをBにコピーしたいです。
①データの形式を.rawから.datに変換
②データの中には含まれる+を+0に変換

何か良い方法をご存知でしたらおしえていただけると嬉しいです。

A 回答 (2件)

ご質問が漠然としているため多くの回答者は何を答えて良いやら判断が難しいと思います。

もう少し絞って限定した質問をいただければ回答も付きやすいと思います。

「一定時間毎に特定の処理をしたい。」とのことですが、これにはLinuxに備わるcron機能、あるいはシェルスクリプトファイルの中でsleepコマンドを用いた無限ループを実行することができると思います。
どちらも専用のシェルスクリプトファイルを作成して使用することになると思います。cronは予め実行開始時間、実行間隔、実行機能を登録しておくことで、パソコンがbootを完了した直後から勝手に機能が有効になります。Windowsのサービス機能と少し似ています。。
一方のsleepコマンドを使ったシェルスクリプトファイルの実行は、ユーザがパソコンにログインした後当該スクリプトを起動することで処理が開始されることになります。
ご質問にある『一分毎...』の時間を守ることが重要ならcron機能のほうが優れていると思われますが、一方ファイルコピー及び変換が一分間で間に合わない事態が生じると、負荷が急激に大きくなりトラブルの元になるかもしれません。

以下は10秒毎にechoコマンドを実行するスクリプトの例です。

#!/bin/csh -f
# File name: test

# Infinite loop
Label_1:
echo "Hello World"
sleep 10 # 10(sec)
goto Label_1

1.ファイルコピー
ご質問には何らご説明がありませんが、相手のパソコンのファイルシステムをnfsマウントしてあるのなら、前述のスクリプトに"cp"コマンドで繰り返しコピーすることができるでしょう。
nfsマウントしていないのなら"sftp"コマンドで"get"あるいは"put"することでファイルをコピーすることができます。但し"sftp"コマンドの利用には更にひと手間かける必要があるでしょう。

2.ファイル名の生成
固定したディレクトリにご質問のようなファイルが生成されるなら、スクリプトの中で次のようにファイル名を生成できます。

#!/bin/csh -f
# File name: test (Infinite loop)

Label_1:
set Name = `date '+%Y%m%d%H%M%S'`
set Ifile = "$Name.raw"
set Ofile = "$Name.dat"
echo "InputFile = $Ifile, OutputFile = $Ofile"

sleep 10 # 10(sec)
goto Label_1

これを実行すれば次の出力が得られます...

$ ./test
InputFile = 20230823140256.raw, OutputFile = 20230823140256.dat
InputFile = 20230823140306.raw, OutputFile = 20230823140306.dat
InputFile = 20230823140316.raw, OutputFile = 20230823140316.dat
InputFile = 20230823140326.raw, OutputFile = 20230823140326.dat

ちゃんと10秒毎に実行されているのが判ります。

3.データの形式を.rawから.datに変換
これは全く意味が判りません。何かのバイナリファイルをテキストデータに変換する、の様にとれますがご質問の中に説明がありません。

●ソフトウエアをバッチ処理で使う
ご質問者様が既に変換ソフトをお持ちでバッチ処理で利用できるものなら、単純にスクリプトにそれを記述するだけです。ここではソフト名を"Conv"だとすれば...

#!/bin/csh -f
# File name: test (Infinite loop)

Label_1:
set Name = `date '+%Y%m%d%H%M%S'`
set Ifile = "$Name.raw"
set Ofile = "$Name.dat"
Conv $Ifile $Ofile

sleep 10 # 10(sec)
goto Label_1

で良いことになります。

●ソフトウエアを作る
シェルスクリプトでの作成は難しいでしょう。C言語などでの作成が必要になりますが、バイナリファイルのフォーマットが既知でなければ、そもそもそれもできないことになります。何らかの方法で"Conv"変換プログラムを作成できたら、上で説明した方法でスクリプトに組み込むことができます。

4.テキストファイルの文字列変換
上記スクリプトファイルに"sed"コマンドなどを追加することでテキストファイルの文字列変換は簡単にできます。
    • good
    • 1
この回答へのお礼

ありがとう

早速お返事いただきありがとうございました!お礼が遅くなり申し訳ございません。
教えていただいたことを参考にしてみたところ、希望どおりの操作ができました。

お礼日時:2023/08/29 07:55

一般的には cron+rsync 等を使えばよいのですが


https://ja.wikipedia.org/wiki/Crontab
https://ja.wikipedia.org/wiki/Rsync

ご提示の様な変換を咬ませるとなると、
素直にそれなりのスクリプトを bash や python で組むのが一番簡単かと思います。
    • good
    • 1
この回答へのお礼

ありがとう

早速回答いただきありがとうございました!無事できました!

お礼日時:2023/08/29 07:56

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A