<   2011年 09月 ( 17 )   > この月の画像一覧
(Linux)シェルスクリプトで自身の絶対パスを取得したい
シェルスクリプトで、自分自身のスクリプトの絶対パスを取得する方法ですが、下記のようにするといいようです。

#!/bin/sh
#↓自身のスクリプトの絶対パス(ファイル名無し)
echo $(cd $(dirname $0);pwd)
#↓自身のスクリプトの絶対パス(ファイル名有り)
echo $(cd $(dirname $0) && pwd)/$(basename $0)

結果:
/root/sh
/root/sh/test01.sh


ちなみに、これで知ったのですが、「$()」でコマンドの実行結果を取れるようです。「``」と同じ意味みたいです。
「$()」のほうがネストが効くので使いやすいかもしれません。


参考:
シェルスクリプトで相対パス指定したファイルを絶対パスへ変換する | 半袖野郎 blog.hansode.org
Bashシェルスクリプトで自分の絶対パスを取得 | #8
変数を使用する - UNIX & Linux コマンド・シェルスクリプト リファレンス
[PR]
by Jehoshaphat | 2011-09-26 01:44 | Linux | Trackback | Comments(0)
(Linux)ディレクトリのサイズを知りたい
Windowsだとフォルダのプロパティで使用サイズが分かるわけですが、Linuxでは du コマンドでわかるようです。


・指定したディレクトリ以下のすべてのディレクトリ毎の使用サイズ(KB)を表示
# du ディレクトリパス(パスを省略すると現在のディレクトリ)
80 ./a
120 ./test
300 .
左側の数字がサイズ。(デフォルトキロバイト)

・指定したディレクトリ以下のすべてのディレクトリ毎の使用サイズ(MB)を表示
# du -m ディレクトリパス(パスを省略すると現在のディレクトリ)

・指定したディレクトリの総容量(KB)を表示
# du -s ディレクトリパス(パスを省略すると現在のディレクトリ)

・単位をつけて指定したディレクトリの総容量(KB)を表示
# du -s -h ディレクトリパス(パスを省略すると現在のディレクトリ)



参考:
【 ディレクトリの使用サイズを調べる 】 - Linuxコマンド逆引き大全:ITpro
[PR]
by Jehoshaphat | 2011-09-26 01:42 | Linux | Trackback | Comments(0)
(Linux)Hyper-V環境でntpdによる時刻同期がうまく動かない
(Linux)ntpdを使った時刻同期方法で、ntpdによる時刻同期方法を書きました。

しかし、Hyper-V上で動いているLinux(CentOS5.6)でntpdがうまく動かないのです。
(Hyper-V自体にもホストOSとゲストOSの時刻同期機能があり、Linux-IS2.1でも対応してるらしいですがはやり狂ってしまいます。なので、ntpによる同期は必要です)

ntpq で ntpd の状況をみると下記のようになります。

# ntpq -p
remote refid st t when poll reach delay offset jitter
==============================================================================
ntpsvhogehoge.c 10.10.1.100 4 u 4 128 377 0.386 -3419.5 1233.04
*LOCAL(0) .LOCL. 10 l 48 64 377 0.000 0.000 0.001

NTPサーバに同期せず自分自身に同期しようとしています。

で、いろいろ調べた結果、VMwareの時刻あわせ 2008年冬版 - SH2の日記で原因を見つけました。
どうやら、LinuxKernel 2.6.18 ではタイマー割り込みが秒間1000回(1msおき)に走っているようです。
このタイマー割り込みによって時刻も進んでいるわけですが、割り込み回数が多すぎてHyper-Vが割り込みを取りこぼしてしまうことが原因のようです。

補足ですが割り込み回数はvmstatで分かるようです。

# vmstat 1
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 60 14840 86640 705432 0 0 26 4 16 32 0 1 99 0 0
0 0 60 14840 86640 705432 0 0 0 0 1033 31 0 1 99 0 0
0 0 60 14840 86640 705432 0 0 0 0 1013 27 0 0 100 0 0

system の in のところ(太字)が割り込み回数のようです。

ということで、タイマー割り込みのタイミングを広くしてやればいいということですね。
カーネル再構築しなくても、ブートローダーのカーネル起動オプションで設定できるようです。

# vi /boot/grub/grub.conf

title CentOS (2.6.18-238.9.1.el5)
root (hd0,0)
kernel /vmlinuz-2.6.18-238.9.1.el5 ro root=/dev/VolGroup00/LogVol00 hda=noprobe hdb=noprobe divider=10 clocksource=acpi_pm
initrd /initrd-2.6.18-238.9.1.el5.img

カーネル起動パラメータにdivider=10 clocksource=acpi_pmを追加してやればいいようです。
divider で指定した間隔でタイマー割り込みが入るようです。(10なら10msおきに割り込み、つまり秒間100回となる)
clocksource=acpi_pm とすることで、divider指定時のハングする問題を回避できるようです。

これで再起動して、しばらくしてからntpqで確認するとちゃんと動いていました。

# ntpq -p
remote refid st t when poll reach delay offset jitter
==============================================================================
*ntpsvhogehoge.c 10.10.1.100 4 u 182 256 377 0.274 -58.869 19.775
LOCAL(0) .LOCL. 10 l 7 64 377 0.000 0.000 0.002


いざ探すと、結構情報が見つかったので、Hyper-VでLinux運用する上では常識のことなのかもしれません。

参考:
EZ-NET: Hyper-V 上の Linux でシステム時刻を同期する (CentOS 5.4) - Linux の使い方
Hyper-V と NTP(Linux ntpd) 時刻同期の問題 - nekohamawalker's Blog - MASUDAQ.COM Blogger
[PR]
by Jehoshaphat | 2011-09-26 01:40 | Linux | Trackback | Comments(0)
(Linux)ntpdを使った時刻同期方法

(Linux)ntpdateを使った時刻同期方法では、ntpdate コマンドを使って時刻同期してました。
ntpdateは一気に時間を変える方法なので、サーバにはあまり望ましく有りません。

ということで、CentOS5.5で徐々に時刻をあわせる ntpd を使った時刻同期をしてみました。

ntp パッケージが必要になります。
入ってない場合は、下記コマンドでインストールします。

yum install -y ntp


大幅に時刻がズレている場合、先に、ntpdate で同期したほうがいいです。

ntpdate ntp.nict.jp
hwclock --systohc ←ハードウェアクロックも同期


/etc/ntp.conf を編集し、同期するサーバを追加します。


# vi /etc/ntp.conf

## 時刻問い合わせのみ答える
restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap

server 0.centos.pool.ntp.org
server 1.centos.pool.ntp.org
server 2.centos.pool.ntp.org
 ↓
#サーバの設定(nictは3回同じを書かないといけないらしい)
server -4 ntp.nict.jp
server -4 ntp.nict.jp
server -4 ntp.nict.jp
server -4 ntp.jst.mfeed.ad.jp
server -4 ntp.asahi-net.or.jp
server -4 192.0.0.10 iburst

-4はIPv4を使うというオプションのようです。
"iburst" は起動時に多数ポーリングし、初期化時間を短縮します。

設定が終われば ntpd を起動します。また、Linux起動時に動くようにしておけばいいでしょう。

# service ntpd start
# chkconfig ntpd on


ntpq コマンドを使うと、ntpdの状態を確認できます。

# ntpq -p
remote refid st t when poll reach delay offset jitter
==============================================================================
210.171.226.40 .NICT. 1 u 83d 1024 0 20.669 1.707 0.000
*ntp2.jst.mfeed. 210.173.160.86 2 u 721 1024 377 20.007 3.282 2.579
+orion.asahi-net 210.171.225.76 2 u 125 1024 377 20.763 1.184 0.219
+hogehogeserve.c 202.224.32.4 3 u 657 1024 377 0.279 -9.904 0.694
LOCAL(0) .LOCL. 10 l 6 64 377 0.000 0.000 0.001

"*" が付いていれば時刻同期出来ているようです。
ntpq での結果の見方は、ntpq出力内容の説明のくす牧場 : linux/ntpd [ntp, ntpd(Linuxでの時計の合わせ方)] - ゐ記が参考になります。



参考:

Linux NTP クライアントによる時刻同期の設定 - nekohamawalker's Blog - MASUDAQ.COM Blogger

気の向くままに ~備忘録@wiki~ - NTP
日本標準時プロジェクト 公開NTP FAQ
[PR]
by Jehoshaphat | 2011-09-26 01:36 | Linux | Trackback | Comments(0)
(Linux)シェルスクリプトの論理短絡演算子
シェルスクリプトで数値が入った2つの変数を比較したいと思ってます。
しかし、片方の変数は空になる可能性も有ります。

ということで、当初下記のような条件文を書いていました。


value1=
value2=20110410
if [ -n "$value1" ] -a [ $value1 -lt $value2 ] ; then
echo ok
fi

しかし、value1を空にして動かすと、"[: too many argument" というエラーになります。
原因は and 演算子に当たる -a が短絡演算子(ショートサーキット)でなかったことでした。

つまり、最初の空文字かどうかのチェックで false になっても、後半の数値比較の構文が動いてしまうわけですね。
このような場合は、短絡演算子を使う必要がありますが、シェルスクリプトの場合、 && , || でOKのようです。

value1=
value2=20110410
if [ -n "$value1" ] && [ $value1 -lt $value2 ] ; then
echo ok
fi


[]は、if文の条件でよく使われる test 構文を省略したやつのようです。
[ の直後と、 ] の直前にスペースがいるのに要注意です。

また、空文字じゃないかどうか調べる際に、「-n 変数」という書式になるわけですが、変数をダブルクォーテーションでくくらないといけません。
-z (空文字かどうか)調べるときも同じです。
このあたりの話は、シェルスクリプトで空文字列かどうか調べる。 - masa.edw the ハバネロブリーダーで分かりやすくまとめられてました。

久しぶりにシェルスクリプト触ったんですが、基本的なことすっかり忘れた3流PGでした。

参考:
シェルスクリプト :: 条件分岐 if
if 文と test コマンド - UNIX & Linux コマンド・シェルスクリプト リファレンス
[PR]
by Jehoshaphat | 2011-09-23 23:39 | Linux | Trackback | Comments(0)
ターミナルサーバで全ユーザのプリンタドライバの設定を変更する
ターミナルサーバ(WindowsServer2003 R2)でいくつかのプリンタドライバをインストールしているんですが、困ったことに初期値がカラーの片面かつ集約無し印刷になっています。
コスト削減のためにデフォルト値を白黒で集約有りの両面印刷にしたいと思っています。

個々のユーザに、プリンタの印刷設定の規定値を変更させたいのですが、徹底されるとは限りません。
という事で、全ユーザの印刷設定を一気に変える方を調べてみました。

サーバ管理者で、プリンタのプロパティを開き、[詳細設定]タブ→[標準の設定]で、白黒や集約等の設定を行います。

これをすると、すでにユーザが別の設定を指定場合でも、この標準の設定に置き換わります。
また、新しいユーザが使おうとしたときは、この標準の設定となります。

ちなみに、ターミナルサーバでなくても、プリンタの共有をしている場合も上記の設定を行うことで、クライアントの設定も変更できるようです。

これがWindowsServer2008で、ActiveDirectory組んでいると、グループポリーとかでもできるようですが。。。

参考:
Technet:印刷の既定値を設定する
MSサポート:Windows XP での印刷設定の変更
[PR]
by Jehoshaphat | 2011-09-23 23:02 | サーバがらみ | Trackback | Comments(0)
IEでExcelやWordのファイルをインライン表示する

普通、IEでExcel,Wordのファイルリンクを押下し、ダイアログで「開く」を押下するとOfficeが立ち上がり別表示されます。

しかし、インライン表示(IE内で表示)することもできるようです。

方法としてはフォルダオプションで拡張子を選択し、[詳細設定] → [同じウィンドウで開く] にチェックがあると、インライン表示になるようですね。
[PR]
by Jehoshaphat | 2011-09-23 23:00 | 豆知識 | Trackback | Comments(0)
(HTML)指定時間後別ページにジャンプさせる

よくサイト移転で、「新しいサイトに移転しました。○秒後にジャンプします」みたいページを見かけます。
てっきり、Javascriptでやってるのかと思いましたが、下記のようなHTMLのメタタグでもできるようです。

<meta http-equiv="refresh" content="秒数;URL=htt://jehupc.exblog.jp/">

非常に簡単ですね。


Javascriptだと下記のようにできるようです
<SCRIPT language="JavaScript">
<!--
mnt = 5; // 何秒後に移動するか?
url = "http://www.eweb-design.com/"; // 移動するアドレス
function jumpPage() {
location.href = url;
}
setTimeout("jumpPage()",mnt*1000)
//-->
</SCRIPT>

一定時間経過後に指定したページへ移動する - JavaScript
自動的に特定のページにジャンプさせる -HTMLタグ辞典-
[PR]
by Jehoshaphat | 2011-09-23 22:50 | Webがらみ | Trackback | Comments(0)
(ツール)WEBサイトのリンクチェックを行う
WEBサイトを更新していると、リンク先がリンク切れになってたりすることがあります。
一つ一つを追っかけるのは非常に労力掛かるので、その際のチェックに役立つツールです。

Website Explorer
リンク先がリンク切れになっているかどうかを調べるツールですが、非常に使いやすかったです。

Windowsアプリなので、ダウンロードして使う必要があります。

解析後に、サイト情報画面を表示してくれ、リンク切れを含むエラー一覧をはじめデータ更新頻度や、画像一覧表示、全文検索も出来ます。
リンク切れチェックに関しては、内部(同ドメイン内)と外部も分けてチェックできるのは嬉しいですね。


W3Cリンクチェッカー
W3Cが提供するオンラインツールです。
オンラインでスキャンできるのは評価できるのですが、英語Onlyなのでちょっと分かりづらいです。


孤島発見器
これは、ローカルでHTMLを編集してて、リンクが貼られていないファイルを検知するのに非常に役立ちました。
特にバックアップのHTMLや不要になった画像ファイルの整理に有用です。

フォルダを指定後、サイトトップの index.html を右クリックし「このページをTOPページにする」とする必要があります。

青色のファイルは無効なリンク(リンク切れ)を含むファイルで、ファイルの右に鎖マークが有るものがどのファイルからもリンクを貼られていないいわゆるゴミファイルです。

リンク切れとゴミファイル両方をチェックできるので助かります。
[PR]
by Jehoshaphat | 2011-09-23 22:48 | ツール | Trackback | Comments(0)
PukiWikiのサーバ移行
PukiWikiを別サーバに移行しました。
移行元と移行先環境は下記のとおりです。

WindowsXP
Apache 2.0.52
PHP 5.0.2.2

CentOS 5.5(カーネル2.6.18)
Apache 2.2.3
PHP 5.1.6

作業としては、pukiwikiのフォルダをコピーするだけでOKでした。
特に凝ったプラグインもいれてなかったので、移行は非常にスムーズでしたね。

ただ注意するのはディレクトリのアクセス権(パーミッション)ですね。

どのディレクトリをどういうパーミッションにしないといけないかはPukiWiki/Install/インストール方法に載ってます。
が、下記のシェルスクリプトで自動的にやってしまうのが楽かもしれません。

#!/bin/sh
chown apache:apache -R ./*
chmod 777 attach/ backup/ cache/ counter/ diff/ trackback/ wiki/
chmod 666 cache/*.dat
chmod 666 wiki/*.txt
chmod 755 *.php
chmod 755 lib/*.php
chmod 755 plugin/*.php
chmod 755 skin/*.php


参考:
pukiwikiの移行 - ととちの日記
[PR]
by Jehoshaphat | 2011-09-23 22:46 | 豆知識 | Trackback | Comments(0)