• ベストアンサー

シェルスクリプトでの時間合わせ

以下の処理を、シェルスクリプトを使って自動化しようと思っています。 作成日が現在日時ではないファイルを、たくさん作成するスクリプトです。 1、現在日時を変更 ↓ 2、ファイルをたくさん作成 ↓ 3、現在日時を正しいものに戻す この、現在日時を正しいものに戻す処理をどのように行おうか迷っています。 ちなみに、インターネットは外部に繋がっていないので、 外部ntpサーバを使用しての時刻合わせはできません。 また、ファイル作成処理に時間がかかる事が予想できるので、 処理開始時に現在時刻を覚え、終了時にその時間に戻した場合は、 (作成処理時間分)時刻がずれてしまう懸念があります。 なにかいい方法があったら教えてください。 よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.1

考え方だけ記述します。 1.変更前の現在時刻を記憶(時刻1とします) 2.時刻の変更(時刻2とします)(時刻1と時刻2は実時間上、同時刻とします) 3.ファイルをたくさん生成。 4.時刻を取得(時刻3)とします。 5.変更すべき時刻=時刻1+(時刻3-時刻2) 6.上記の変更すべき時刻で変更する。 (要は時刻1から経過した時間分が現在時刻になります) 以上。

yamadaaoki
質問者

お礼

すみません、お礼を補足の方に書いてしまいました。 先ほど >ファイル作成途中に何度か日付、時刻共にを変更しているので、 >その方法で経過時間が取得ができません…。 と書きましたが、その都度経過時間を取得していけば大丈夫そうですね。 なので、この方法で試してみたいと思います。 アドバイス、ありがとうございました。

yamadaaoki
質問者

補足

回答、ありがとうございます。 なるほど、経過時間を足すのですね。参考になります。 ただ今回の場合、質問記事には書いていないですが、 ファイル作成途中に何度か日付、時刻共にを変更しているので、 その方法で経過時間が取得ができません…。 なので他の方法を探そうと思います。 貴重なアドバイス、ありがとうございました!

その他の回答 (3)

  • notnot
  • ベストアンサー率47% (4848/10261)
回答No.4

Unix/Linuxであれば、大抵touchコマンド(ファイルのタイムスタンプの変更コマンド)があるので、現在時刻を変更するのでなく、touchコマンドで望みのタイムスタンプを持つファイルを作るのが正しい方法です。 例: touch -d "2009-01-05 00:23:45" file1 file2 file3 ... おかしな事をする必要が出てきたら、そもそも考え方が間違っていると思いましょう。 もっと言うなら、 >作成日が現在日時ではないファイルを、たくさん作成する がそもそも間違っているのかもしれません。

yamadaaoki
質問者

お礼

回答、ありがとうございます。 そうですね。アクセス時刻や更新時刻ならともかく、 作成時刻を変更する行為は、本来不自然なものですよね。 今後、時間のある時に設計から見直してみようと思います。 貴重なご意見、ありがとうございました。

noname#208124
noname#208124
回答No.3

HFS+は作成時刻サポートしてますね 作成時刻無いというのは訂正します

yamadaaoki
質問者

お礼

なるほど、MacOSのファイルシステムは例外なのですね。 勉強になりました。ありがとうございます。

noname#208124
noname#208124
回答No.2

UNIX系のOSだと作成時刻ってファイルシステムに無いはずですけど atime/mtimeだけならtouch -t使った方早いですよ 時刻覚えさせとくならハードウェアクロックに覚えさせておけばいいと思う Linuxならhwclock --hctosysと--systohc

yamadaaoki
質問者

補足

回答、ありがとうございます。 アクセス時間や修正時間はコマンドで変更できるのですね。勉強になりました。 そして、大事な所を書き忘れていましたが、このシェルスクリプトを 実行する環境はMac OS Xです。 どうやらMac OSではハードウェアクロックを使えない?ようです。 ( hwclock -rとコマンドを入力した所、実行できませんでした) また、atime/mtimeだけではなく、ctimeも変更したいと考えています。 投稿内容が不十分で申し訳ありませんでした。 大変勉強になりました。ありがとうございます。

関連するQ&A

  • 集計するシェルスクリプト

    りんご,3 みかん,2 りんご,5 りんご,1 なし,3 みたいなデータを りんご,9 みかん,2 なし,3 のように集計するシェルスクリプトを書こうと思っています。 sortとuniqでレコードの名前を外部ファイルに書き出してループ処理というのは思いついたのですが、いまいち綺麗じゃないような気がします。外部ファイルを使わずに処理する方法があれば、教えてください。

  • UNIXでシェルスクリプトを作ることを始めましたが、まだ未熟者です。

    UNIXでシェルスクリプトを作ることを始めましたが、まだ未熟者です。 既存のスクリプトが複数あるのですが、 全てに対して同じ処理を入れ込む必要があります。 入れ込む内容はレイアウトを変更するだけ(awkで書く予定)なので簡単なのですが、 既存スクリプトに全て書き込むのは大変です。 また入れ込んだ処理内容に変更があったときに、全てのスクリプトに変更をひとつひとつ反映させるのは大変です。 入れ込む処理を別ファイルで作成しておいて、 既存スクリプトからはこのファイルを参照するだけにしたいのですが、 どのように書いたらいいのでしょうか?教えてください。

  • シェルスクリプト間で排他をとりたい

    環境 linux(redhat) 使用シェル bash シェルスクリプトAとシェルスクリプトBを作成し、 シェルスクリプトAが動作している間は、シェルスクリプトBの動作を禁止したいと考えています。 例えば、シェルスクリプトAが起動している状態で、シェルスクリプトBが起動されたとき、シェルスクリプトBは、シェルスクリプトAが起動していることを検知して、自発的に処理を終了するようにしたいと考えています。 上記のような仕組みをシェルスクリプトで実現可能でしょうか? 基本的には、シェルスクリプトの先頭で、ある資源のロックを行い、終了時にロックの解放ができれば、その仕組みは実現可能と考えています。 (シェルの異常終了時は、ロックが自動的に解放されることが望ましい) 上記のようなことをシェル(bash)で実現可能でしょうか。 bash単独での方法、もしくはbashからperl,C言語作成の実行モジュールを呼び出す方法でもかまいません。 (ちなみにperl(もしくはC言語作成のモジュール)単独では実現可能なことはわかっています)

  • シェルスクリプトでのechoについて

    お世話になっております。 echo文を使用して変数内に格納された文字列をファイルに追記しようとするとエラーが発生します。 エラーが発生している構文: echo $add >> $file エラー内容: read.sh: line 89: /etc/ntp.conf: そのようなファイルやディレクトリはありません エラー発生時の変数の中身: $add → server 192.168.1.1 $file →/etc/ntp.conf 同シェルスクリプト内のほか箇所では、echo文を使用しての追記は正常に行えております。 また、/etc/ntp.confは存在しており、catコマンドで内容の出力ができることを確認できております。

  • シェルスクリプトで困っています 2

    度々申し訳ございません。 現在、Linuxマシン1からLinuxマシン2へTelnetでログインし、Linuxマシン2上にあるシェルスクリプト(/bin/sh)を実行し、Linuxマシン2上のプログラムを実行した後、Linuxマシン2からログアウトするシェルスクリプトを作成中です。 その、Linuxマシン2からログアウトする際に、 "exit"を記述しているのですが、その"exit"がTelnetログアウトの意味で実行されず、シェルスクリプトを終了するの意味で実行されていて困っています。 どなたか上手くTelnetからログアウトできるようにシェルスクリプトを組む方法をご存知ではないでしょうか?もし判りましたらご教授下さい。 よろしくお願い致します。

  • Redhat9にあるシェルスクリプトをWinXPのアプリから実行させる方法

    サーバ:Redhat9(ファイル[smb],DB[postgres]サーバ) クライアント:WinXPorWin2000 Redhat9でDBの一括処理をシェルスクリプトで作成しました。 自動処理はcrontabなどで行っていますが、手動処理も行いたいと思います (DBだけではなく、いろいろ活用する予定です) クライアントはVC6.0で作成されたアプリが動作しています。 (要はクライアントサーバシステムです) クライアントのアプリからボタンクリックでRedhatのシェルスクリプトを実行するよい方法はありますか? 現在案として (1)Redhatでシェルスクリプトを作成する (2)Windowsでrshコマンドを使用しシェルスクリプトを実行するバッチファイルを作成する (3)クライアントのアプリからバッチファイルを実行する という方法を考えていましたが、 rshのPermission deniedの問題で先に進めません。(この件は別スレッドで質問済みです) 何か良い案をご教授頂けますでしょうか? よろしくお願いします

  • シェルスクリプトの書き方

    すみません、あまり調べる時間がなく、質問させて頂きました。 例えば下記のようなURLを実行(test_batch.jspはバッチ処理です)をするシェルスクリプトの下き方が良く分かりません。 http://1.12.3.4:8080/admin/test_batch.jsp よろしくお願いします。

  • シェルスクリプトとphpを使ったプログラミングについて

    UNIXサーバで、現在、シェルスクリプトやphpを使ってプログラムを書いています。 今は「csh cmd ファイル名」という形でシェルスクリプトを実行しています。このままではプロンプト画面で味気ないので次のようにしたいのですが、やり方が分りません。 まず、phpやhtmlで作成したファイル提出画面にてファイルを提出してもらいます、そして、それを受け取ります。その時例えば送信ボタンを押すと思うのですが、そのボタンを押したらファイル名を受け取り「csh cmd ファイル名」が実行されるといふうにしたいのです。何かいい方法があれば教えて頂きたいです。phpでなくてもいいので、お願いします。

    • ベストアンサー
    • PHP
  • 簡単なシェルスクリプトを見てください。

    次のようなシェルスクリプトを作成しました。 #!/bin/sh echo [$1] awk '/"0312345678"/ {print}' /test > /test1 awk '/$1/ {print}' /test > /test2 のように簡単なスクリプトです。 $ sample \"0312345678\" で実行させたら、echo では"0312345678"に出力されます。 しかし、test1にはちゃんと結果が入っていますが、test2は空のファイルです。 なぜ、結果が違うのですか? 実行時、引数を渡す方法で、test1と同じ結果を得たければ、どうすればいいのですか?

  • シェルスクリプトをバックグラウンドで

    いつもお世話になってます 初歩的な質問かもしれませんが、自力で解決できなかったのでお力をお貸しください 2点質問があります、シェルはbashです 1 シェルスクリプトを記述したファイルをダブルクリックで使っています このファイルをダブルクリックした時にターミナルを表示させないでシェルスクリプトだけ実行する事はできないでしょうか? 2 シェルスクリプト終了後、ターミナルが閉じません、スクリプト終了と同時にターミナルを閉じる方法を教えてください [プロセスが完了しました]というメッセージが出てターミナルそのものが閉じません よろしくお願いいたします

専門家に質問してみよう