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

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

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

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Q&A

解決済

3回答

9431閲覧

HTMLファイルの中のシェルスクリプトが起動してくれません

kayotinkome

総合スコア7

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

0グッド

0クリップ

投稿2017/01/10 04:29

編集2017/01/11 01:39

HTMLファイルの内容

html

1<html> 2<head> 3</head> 4<pre> 5今回が<!--#exec cmd="./count.sh" -->回目に該当する 6</pre> 7</html>

count.shの内容

bash

1#!/bin/sh 2if [ -f lookfile.txt ];then 3sleep0.19 4else touch lookfile.txt 5#!/bin/bash 6CNT_FILE=number.txt 7if[ ! -f $CNT_FILE ] 8then 9echo 0 > $CNT_FILE 10fi 11read hoge < $CNT_FILE 12expr $hoge + 1 > $CNT_FILE 13echo $hoge

webサーバ apache2
OS Windows10

今回が<!--#exec cmd="./count.sh" -->回目に該当する

<!--#exec cmd"=./count.sh"-->

上記の部分が表示されません。

エラーメッセージの表示はありません。

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

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

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

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

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

ikedas

2017/01/10 08:53

コードが読みにくいので、ヘルプ https://teratail.com/help を見て、「コードを書く」ときの書きかたをためしてみていただけますか。
mit0223

2017/01/11 01:27

「起動してくれません」というのは、具体的にどのような現象でしょうか?エラーメッセージが出るのであれば、メッセージの内容を記載してください。また、サーバの環境(Webサーバのバージョン、OSのバージョン)を記載してください。サーバ側のログにエラーが出ていないかを確認し、出ているのであれば、その内容を追記してください。
Y.H.

2017/01/11 01:49 編集

出力結果(実行結果)は正確に記載しましょう。 「上記の部分が表示されません。」とはブラウザーの「ソースを表示」で表示されるHTMLが「今回が<!--#exec cmd="./count.sh" -->回目に該当する」と「今回が回目に該当する」どちらになっているのでしょうか?
kayotinkome

2017/01/11 01:52

今回が回目に該当するとなっています
Y.H.

2017/01/11 02:05

OSがWindows10なのであればタグをLinuxからWindowsなどへ修正してください。
guest

回答3

0

SSI の設定はできていますか?

SSI を許可するためのサーバの設定に従って設定できているかを確認してください。

また、 Apache のログファイルにはエラーメッセージは出ていませんか?


ちなみに

if [ -f lookfile.txt ];then sleep0.19 else touch lookfile.txt

このコードでは、排他制御できていないと思われます。

https://teratail.com/questions/46283

のときの私の回答からコピペですが、

シェルスクリプトでロックで排他制御して、1個ずつしか処理しないようにする技法ということであれば、 flock コマンドで実装するのが良いかと思います。 flock コマンドで実装する場合の lock, unlock 関数の例を示します。

shell

1GIT_LOCK_FILE=/var/run/lock.txt 2GIT_LOCK_TIMEOUT=600 3 4# prepare FD for lock. 5if ! exec {lockFd}>> $GIT_LOCK_FILE; then 6 echo "$datestr fail to open lock file($GIT_LOCK_FILE)." 1>>$LOG 2>&1 7 exit 1 8fi 9 10lock() { 11 if ! flock-w $GIT_LOCK_TIMEOUT $lockFd >/dev/null 2>&1; then 12 echo "$datestr fail to aquire lock, another git pull process may be running." 1>>$LOG 2>&1 13 return 1 14 fi 15 return 0 16} 17 18unlock() { 19 flock -u $lockFd 20}

flockコマンドでのロックの実装は、シェルスクリプトで旧来から常套手段とされているロックファイルの存在だけを確かめる方法と比べると、以下のメリットが有ります。

  • タイムアウト処理を実装してくれる(上記のコードで 10 分待ってロックが取れなければ諦めます)
  • ロックを保持しているプロセスが unlock を実行せずに異常終了してもロックが開放される

投稿2017/01/10 22:12

編集2017/01/11 01:50
mit0223

総合スコア3401

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

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

0

自己解決

count.shの内容が間違っていただけでした。
ご迷惑をかけて申し訳ございません。

bash

1#!/bin/bash/ 2while [ -f .count.lock ] 3do 4sleep 1 5done 6touch .count.lock 7declare -i i 8i='cat count.txt' 9i=$i+1 10echo $i 11echo $i >| count.txt 12rm -f .count.lock

投稿2017/01/11 02:10

kayotinkome

総合スコア7

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

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

mit0223

2017/01/11 03:40

解決しているのでもう良いのかもしれませんが、ファイルの存在確認と touch がアトミックな操作になっていないので、排他制御できていません。 参考:https://heartbeats.jp/hbblog/2013/10/atomic03.html また、このスクリプトは Windows では動作しないと思いますが、何か互換性のあるものがはいっているのでしょうか?
guest

0

webサーバ apache2
OS Windows10

実行環境が追加されたのでやっと判明しました。
タグにlinuxと記載されているのですがwindowsでしたか。タグの修正をしてください。

Windowsではbashは実行できません。
バッチファイルなどで書き直してください。

それともwindows用のbash互換のものをインストールされ、*.shに関連付けされているのでしょうか?

投稿2017/01/11 01:56

編集2017/01/11 02:03
Y.H.

総合スコア7914

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問