質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

Q&A

解決済

2回答

1184閲覧

bin/shスクリプト内で設定ファイルの記述を変更したい

L_2

総合スコア2

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

0グッド

0クリップ

投稿2020/05/18 09:17

お世話になっております。
規定のプログラム(C)をシステム日付と前回起動時刻の差が一定周期以上になった場合
且つ前回周期の処理が完了していれば実行するというシェルを作成しています。
どういった処理をすればよいのかは大体分かるのですがシェルでコーディングするのは初めてでどう書けば良いかがわからず
ご教授いただければと思います。

前提・実現したいこと

同フォルダー内にある設定ファイル(.txt?)に起動時刻を保存して、システム日付と前回起動時刻の差を計算
実行毎に更新していくので、書き換えか、設定ファイルの上書きをしていく処理を実現したい。

試したことと補足情報

bin/shで作成しています
自分でもいろいろ調べてみたのですがbashシェルの情報しか出てこず、
なんとも要領がです質問させていただきました。
(bashとshの違いは、「.」でのファイルの読み込み等で結果が異なる、ぐらいの知識)

以上よろしくお願いいたします

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

前回周期の処理が完了していれば

Linuxであれば、ファイルあるいはディレクトリに「ロック」をかけることで多重実行を防ぐ flock というコマンドが有用です。

一例としてメインの処理を行うスクリプト ( 例えば x.sh ) を用意しておいて、

flock -n x.sh ./x.sh arg1 arg2 …

のようにすることで、( スクリプト自身をロックファイルにして ) 実行中でなければ実行、実行中ならエラー終了というように制御できます。
※ほかにも色々使い方があるので、詳しくは flock(1) の manページ ( コマンド: man 1 flock ) をご参照ください。flock(2) は似てますが違うのでご注意ください。

投稿2020/05/18 12:49

angel_p_57

総合スコア1681

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2020/05/18 13:07

時刻ファイルを更新するかどうか決めないといけないですが、 ・ロックに失敗した(実行中だった) ・ロックが成功したがコマンドが RC=1 で終了した の区別が付きますでしょうか?
angel_p_57

2020/05/18 14:21

「メインのコマンド/スクリプトが取り得ない終了ステータス」を把握した上で、になりますが、flockによるロック失敗時のステータスコードは -E で調整できます。 以下、flock(1) manページより -E, --conflict-exit-code number  The exit code used when the -n option is in use, and the conflicting lock exists,  or the -w option is in use, and the timeout is reached. The default value is 1.
otn

2020/05/18 14:28

なるほど。ありがとうございます。 普段CentOS6を使っているので、flockが古かったです。
guest

0

ベストアンサー

Linuxだと/bin/shが実はBashというOSも多いですが、Bashではないのは確実でしょうか?

(bashとshの違いは、「.」でのファイルの読み込み等で結果が異なる、ぐらいの知識)

そこは、両者同じです。

時刻の差を求めるには、dateコマンドが使えます。
date +%sで、1970-01-01 00:00:00からの秒数が得られるので(Linuxじゃないと駄目かも)、差を調べます。

sh

1#!/bin/sh 2 3#実行するプログラム 4PROG=/path/to/foo 5#時刻を記録するファイル 6FILE=$HOME/.last-execution 7#この秒数以上経っていたら 8LIMIT=3600 9 10if [ -r $FILE ] 11then LAST=`cat $FILE` 12else LAST=0 13fi 14NOW=`date +%s` 15DIFF=`expr $NOW - $LAST` 16if [ $DIFF -gt $LIMIT ] && ! ps -C `basename $PROG` >/dev/null 17then echo $NOW > $FILE 18 $PROG 19fi

とかでしょうか。

プログラムが実行中かどうかはps -C ~で見ていますが、これもLinuxじゃないと駄目かも。

投稿2020/05/18 10:02

otn

総合スコア85901

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問