2015/08/20

CentOS7.1 インストール作業~ネットワーク接続まで

インストールの前作業

http://isoredirect.centos.org/centos/7/isos/x86_64/CentOS-7-x86_64-DVD-1503-01.iso

http://ftp.riken.jp/Linux/centos/7/isos/x86_64/CentOS-7-x86_64-DVD-1503-01.iso 

この辺からISOイメージをダウンロードして、DVDを作成する。

今回購入したPRIMEGY TX1310M1 は ハードウェアRAIDを実装しており、
インストール時にRAIDのパッケージを追加する必要があった。

CenOS7 install にカーソルを併せてTABを押し、
inst.dd を追加してからインストールを行う。

対話式のモードになるので、fujitsuのホームページから

URL: http://support.ts.fujitsu.com/Download/Index.asp

「Product selection(manually search)」より「Fujitsu Server PRIMERGY」→「PRIMERGY TXxxx」
→「PRIMERGY TX1310 M1」 →「Red Hat Enterprise Linux」→「Red Hat Enterprise Linux 7(x86_64)」→「SATA RAID」→「RHDUP driver package megasr 16.01.2014.0318-1 for RHEL 7 GA」を用意しておく。
加えて、RAIDコントローラは有効にしないと起動時に制御が掛かるらしく、
OSインストール中の最後の再起動で躓いたので
BIOSでSATA Configurationの設定があるので、そこをIDE MODEにした。
必要を感じたらRAIDを組む事にする。



インストール後の設定

先ずは他のクライアントからターミナルで操作したいので、
ネットワークの設定をする。

$ ip address show 
でNICの情報を取る。
このサーバはNICを2つ持っている(19800で購入の割にすごいな)
 
1: lo:  mtu 65536 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp2s0:  mtu 1500 qdisc mq state UP qlen 1000
    link/ether 90:1b:0e:XX:XX:ee brd ff:ff:ff:ff:ff:ff
    valid_lft forever preferred_lft forever
3: enp0s25:  mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 90:1b:0e:XX:XX:dc brd ff:ff:ff:ff:ff:ff

$ nmcli device show enp2s0 で詳細を取る
GENERAL.デバイス:                       enp2s0
GENERAL.タイプ:                         ethernet
GENERAL.ハードウェアアドレス:           90:1B:0E:60:54:EE
GENERAL.MTU:                            1500
GENERAL.状態:                           1000 (接続済み)
GENERAL.接続:                           enp2s0
GENERAL.CON パス:                       /org/freedesktop/NetworkManager/ActiveConnection/3
WIRED-PROPERTIES.キャリア:              オン
IP4.アドレス[1]:                         ip = 127.0.0.1/8, gw = 0.0.0.0
IP6.アドレス[1]:                         ip = ::1/128, gw = ::                     

こんな感じ 

$ nmcli con show enp2s0 を見る。
 
↓サーバ起動時に自動で接続させる 
connection.autoconnect:                 no 
↓DHCPを固定にしたいので、ここはマニュアルにして、IPアドレスを指定。 
ipv4.method:                            auto
これについては、 昔のようなバグはもう無い様なのでGUIで弄ったほうが楽。
 
 
# nmcli con mod enp2s0 connection.autoconnect "yes"
# nmcli con mod enp2s0 ipv4.addresses "192.168.0.XXX/24"
# nmcli con mod enp2s0 ipv4.method "manual" 

# nmcli device disconnect enp2s0
# nmcli device connect enp2s0
 

他のクライアントからTeraTerm等で接続してみる。

2015/08/12

rsyncのエラー 12番

rsync: writefd_unbuffered failed to write 4092 bytes to socket [sender]

今更ながら、rsyncのエラーが起こったので、再度見直し、いろいろと調べてみた所
サイズの大きい圧縮ファイルの所で躓く様なので、そのあたりを調べてみた。

原因の推測
恐らく、ファイルサイズの異なる同じ名前のファイルを参照し、転送を開始する際に、
コマンドの指定が無い時は、差分の転送を行うが、
zip等の場合、内部構成まで見て差分処理を行おうとするようで、
エラーを返してくる模様。

解決方法
・ --whole-file をつけて、差分の送信をやめる。
・ zipやtarで保存する際は、別のファイルとなるように常にdateを付与する処理をする。
・ zip等のファイルは同期しないようにする。
そこで、一番楽そうな --whole-file をコマンドに追加することにした。

スクリプトシェル
#!/bin/sh
# バックアップ先ディレクトリ指定
BackupDIR=/home/*****/dailyBackup

mkdir -p $BackupDIR
# バックアップログ定義
BackupLog=/home/*****/log/rsync_backup.log rm -f $BackupLog
touch $BackupLog
chmod 600 $BackupLog
#エラーチェック
error_exit () {
exit 1
}
#バックアップ実行
echo "`date` backup start" >> $BackupLog
LastBackup=`ls -t $BackupDIR | grep backup | head -1`
NewBackup=`date +%Y%m%d`backup

mkdir $BackupDIR/$NewBackup
rsync -rlptv --whole-file --link-dest=../$LastBackup /home/比較元のディレクトリ/ $BackupDIR/$NewBackup >> $BackupLog 2>&1

code=$?
if [ $code -ne 0 ]; then
cat $BackupLog | mail -s "BACKUP NG CODE IS $code" root
rm -rf $BackupDIR/$NewBackup
error_exit
fi
echo "`date` backup end" >> $BackupLog



2015/07/09

CentOSからPHPを使って MicrosoftSqlServerに接続

CentOSからPHPを使ってMicrosoftSqlSeverに直接アクセスは出来ないらしく、

FreeTDSを使って橋渡しをするらしい。

イメージとしては、
PHP ⇔ FreeTDS ⇔ MsSqlServer
こんな感じの流れのようです。

とりあえず、FreeTDSでSqlServerにつかがるかを実験してみる。

先に unixODBCをインストールしている理由は、
FreeTDSはSybaseやSQL Serverと通信をするためのプロトコルであって(インターフェイス)、
DBへのアクセスをする場合にはODBCドライバを経由して行わなければならない。
らしい。
http://www.amy.hi-ho.ne.jp/jbaba/unix/tdsodbc.htm
↑ここに技術解説があった。みなさんここを見ているらしいです。

# yum install unixODBC-devel

ODBCドライバをインストール。

# yum install freetds-devel
FreeTDSをインストール。

freetdsにSqlServerの設定をする。
# nano /etc/freetds.conf

末尾に

[sqlserver]
host = DBサーバアドレス
port = 1433
tds version = 8.0
charset = sjis
client charset = utf-8
language = japanese

を加える。


charset は デフォルトはCP932だが、今回のベンダの設定では
SeqServerに定義したエンコードはsjisだったようだ。
エンコード関係でやはり30分ほど嵌った。


# tsql -S sqlserver -U ユーザ名 -P パスワード名
locale is "ja_JP.UTF-8"
locale charset is "UTF-8"
1>
となれば接続成功。

1>select * from テーブル名
2>go

このように使う。

ここまでが事前準備。



接続実験


$server=’DBサーバアドレス’;
$username='ユーザ名';
$password='パスワード';
$con=mssql_connect($server,$username,$password);

if($con !=FALSE)
{
        echo "Connection to SqlServer successful
";
}
else
{
        die("Connection to SqlServer failed");
}

mssql_close($con);
?>



次は、二つのDBを跨いだときの取り扱いを残す予定。

2015/06/09

WindowsServer2012で外部サーバとssh同期とSQLサーバのコマンド処理(CSV書出し)


目的
WEBサイト内の一部のコンテンツを非同期処理を行いたいが、
今回、ベンダが用意したOSがWindowsServer2012であったので、
sshや、コマンド処理等、
WindowsServer2012単体で解決出来ない点を
忘れないようにオボエガキしておく。

仕掛け
SQLServer2014の動いているWindowsServer2012マシンで「タスク処理」させる
 ⇒batファイルをつくる
SQLServerをコマンドラインで動かし、必要なカラムを抽出させるクエリをcsvで吐出し
 ⇒bcpコマンドを使う
吐き出したcsvをutf-8に変換する。
 ⇒色々試したが、結果nkfを使うことにした。
レンタルサーバの所定フォルダとwindowsServer2012の所定フォルダの同期をとる
 ⇒ssh接続の方法を単独で持たないようなので、winSCPを利用する。
同期をとったcsvをjQueryを使って整形し、表示させる。


csv書出し用バッチ処理

@echo off
bcp "select ~" queryout "C:\出力先フォルダ\list.csv" -c -t, -S
<192.168.0.xxx> -U <ユーザ名> -P <パスワード>
exit

解説:-c 文字データ型を使用して操作を実行 -t, のカンマ区切りを付与
   -S サーバ名 
   -U ユーザ名
   -P パスワード
※当初、utf-8で出力できないかいろいろ試したが、SQLServerは動作保障外というだけあって、

-C 65001 を付けると書き出さなかった・・・。



エンコード用バッチ処理
 
@echo off
cd C:\作業フォルダ
type top.csv list.csv > before.csv
nkf32.exe -w80 before.csv > listUTF8.csv

解説:bcpコマンドは表題行を書き出してくれないので、
   予め、表題行のcsvを作っておき、typeコマンドでくっつけている。
   今回は、top.csvにlist.csvをくっつけて、
   nkf32.exe -w80 でutf-8に変換している。



レンタルサーバへの同期用バッチ処理


@echo off
cd "C:\Program Files (x86)\WinSCP"
WinSCP.exe /console /script="sync"

exit

解説:WinSCP.exe /console /script="スクリプト処理ファイル"
   この一行で、コマンドで動かせる。
   ITmediaさんに解説ページがあった。
   (コマンドリファレンスへのリンクもあり非常に助かった。)


スクリプト処理ファイルの中身


option batch on
open ユーザ名@サーバ名
cd /var/www/html/サーバ側の所定のフォルダ
lcd C:\ローカル側の所定のフォルダ
synchronize remote
exit

解説:synchronize remote リモート側(サーバ側)を同期させる と書くようだ。
   サーバ側のデータを同期させたいのであれば、synchronize local となる。
   両方ならばそのままの、both。
   事前に接続をさせておき、その際、ini等にパスワードは覚えさせておく必要あり。

非同期処理のhtml


<html>
<header>
<script src=\"jquery-1.11.3.min.js\"></script>
<script src=\"jquery.csv2table-0.02-b-2.8.js\" type=\"text/javascript\" charset=\"utf-8\"></script>
</header>
<body>
<div id=\"view\"></div>
<script>
$(function(){
  $(\'#view\').csv2table(\'./listUTF8.csv\');
});
</script>
<script>location.reload()</script>
</body>
</html>
最小の構成はこんな感じ

解説:jquery-1.11.3.min.js
   jquery.csv2table-0.02-b-2.8.js はそれぞれ先駆者のものを利用させて頂いた。
   jquery.csv2table-0.02-b-2.8.js はutf-8でないと文字化けする。

   mimeをかぶせてshift-jisという方法もあるが、
   一発で上手くいかなかったことととブラウザに左右されそうだったので、nkfでの処理を選択した。


WinSCP補足

ツール→環境設定→保存→レジストリからINIファイルに変更
ツール→設定のエクスポート

↓おまじない
◆WinSCPの起動をini起動にする
"C:\Program Files (x86)\WinSCP\WinSCP.exe" /ini=C:\syncXML\WinSCP.ini
winwcp.ini 設定
◆同期のコマンドの変数を2に変える
SynchronizeParams=2にする
◆winSCP.iniは出来れば、WinSCPの直下でない方がいいらしい。



同じような内容を開発ベンダに見積取ったら、
えらい金額が上がってきたので、作ってしまえというのが動機。

2015/04/15

VMWare Player WIN8.1上でWindows98を動かす

Windows8.1 64bit版を利用しているのだが、
どうしても、16bitのソフトを動かす必要ができた。
手持ちのXPは全て独自のインストール用のものだったので、
已むを得ずWindows98をインストールした際のオボエガキ。

VMWare Playerをダウンロード

https://my.vmware.com/jp/web/vmware/free#desktop_end_user_computing/vmware_player/7_0

手持ちのwindows98のISOを作成する。

imgburnを使った。

windows98の起動ディスクなんてもうないので、

http://www.allbootdisks.com/download/98.html
こちらからダウンロードした。

VMWare Playerの仮想マシンの設定で、
フロッピーを追加しimgファイルを自動起動するようにし、
MEMを512MBにして、起動。


仮想マシンを起動
→FDを読みこまれるので、1を選択してDOSを立ち上げる
→fdisk ENTER
→Yのまま ENTER
→1 ENTER
→Yのまま ENTER
→Escを押す
→restart ENTER で再起動
※再起動するので、formatをかける

→1 ENTER
→format C: ENTER
→Y ENTER
→フォーマットが終わったら Exit選択
→ボリュームラベルの入力(空欄のまま) ENTER
→D: ENTER
→setup ENTER
→Windows98インストールスタート

あらかたファイルのコピーが終わると再起動を要求してくるので、
その際に、フロッピーは自動起動しないようにする。
(もう一度DOS起動画面になってしまうため)

このまま使ってもよいが、ファイルのやり取りを画面上でできるようにするため、
VMwareToolsをインストールしておく。

管理の中にVMware Toolsのインストールがあるので、ダイアログに従えばOK。
問題なく使えた。

最後に

あ~、こんな感じで領域作ったな~、しょっちゅうFDISKやFORMATしたな~
と大変懐かしい気分になった。

2015/01/12

NEC PC-BL100RA (CentOS6)をWOL利用する

手順

1  起動時 F2でBIOS起動し、(珍しい日本語のセットアップユーティリティだった)
   詳細⇒リモート電源制御 を [使用する]に変更。

2  CentOSを立ち上げて、有線でネットワークの環境を構築する。
   (NICへの電源供給の関係で、無線は無理っぽかった)

3  WOL対応のソフトをyumでインストール

   # yum -y install ethtool

   # nano /etc/sysconfig/network-scripts/ifcfg-System_eth0

   末尾に
   ETHTOOL_OPTS="wol g"
   を追記する。

起動は各クライアントからマックアドレスに向けてマジックパケットを投げればOK


2014/12/02

pdfファイルに一括してパスワードを設定するため、PDFTkをインストール

複数のpdfファイルに一括してパスワードを設定する事が
かなりの頻度で必要になったので、
手持ちのacrobatで何とかしようと思ったが、
9のstandardしかなく、バッチ処理に対応していなかった。


しょうがないので、フリーのツールを探すと
pdftkがメジャーなようで記事がたくさんあるので、とりあえずインストールしてみる。


# wget https://www.pdflabs.com/tools/pdftk-the-pdf-toolkit/pdftk-2.02-1.i386.rpm
www.pdflabs.com の証明書(発行者: /C=US/O=DigiCert Inc/CN=DigiCert Secure Server CA)の検証に失敗しました:
  発行者の権限を検証できませんでした。
www.pdflabs.com に安全の確認をしないで接続するには、`--no-check-certificate' を使ってください。
SSL による接続が確立できません。


なるほど、
# wget --no-check-certificate https://www.pdflabs.com/tools/pdftk-the-pdf-toolkit/pdftk-2.02-1.i386.rpm


保存完了したので、
# yum install --nogpgcheck pdftk-2*
署名無いので、--nogpgcheck で署名なしのオプションつけないと蹴られる。


インストール後の使い方

変換前ファイル mae.pdf
変換後ファイル(任意名称) ato.pdf
スタンプ      stamp.pdf
印刷のみ許可のオプション owner_pw ***** allow printing

pdftk mae.pdf stamp stamp.pdf output ato.pdf owner_pw ***** allow printing

当初、指定のフォルダにファイルを置き、cronで5分間隔で実行すればいいだろうと
考えていたのだが、
利用者から、cronでの自動化だと操作した感が無く、忘れそうだとの事だったので、
今回は、スクリプトシェルにして、phpで動作させた。

++++++ソース converter.sh++++++

#!/bin/sh
# PDFコンバート&パスワード保護 スクリプトシェル
#
#作業  ディレクトリ /home/storage1/AAA/ConvertPdf
#変換後 ディレクトリ /home/storage1/AAA/ConvertedPdf
#スタンプ /home/storage1/AAA//ConvertPdf/sourse/stamp.pdf


cd /home/storage1/AAA/ConvertPdf
for file in *.pdf; do pdftk $file stamp ./sourse/stamp.pdf output /home/storage1/AAA/ConvertedPdf/`date '+%Y-%m-%d-%H%M%S'_`$file owner_pw **** allow printing; done
rm *.pdf


+++++++++++++++++++++++++++

作業内容
ConvertPdfにあるpdfにstamp.pdfをして印刷のみ許可の状態にしたファイルを
先頭に日付を付けてConvertedPdfにコピーし、
ConvertPdfにあるpdfファイルを削除する。

phpに関して
 phpを動かす同じディレクトリにスクリプトシェルを置かないといけない模様。
 (chdirを使ったが、指定のディレクトリに上手く移動してくれないので、 あきらめた。)

shell_execをhtmlspecialcharsで括らないと、中身をうまく認識できないらしく、
スクリプトシェルが動かなかった。
unixのコマンドだとexecだけでも動くようだが、変数などを使っているので、駄目っぽい。


    $command = './converter.sh.sh';
    htmlspecialchars( shell_exec( $command ) ) ;
?>


あとは、form等でボタンをそれなりに作っておく。


動作試験をして、意図するように動いたので、
あとは、stamp等を調整して完了とする。




2014/06/14

データバックアップ⇒データ移行⇒HDD交換⇒LVM領域拡張

ファイルサーバの空き容量が5GBを割ってしまったので、やむなく交換。
もともと格安のNECサーバに付いていた180GBのSATAⅡをそのまま使っていたが、
500GBに交換することにした。
dumpとrestoreが良いようだが、イマイチ操作が良くわからないので、

ddコマンドと、LVMの拡張で何とかした。

まずは、ddコマンドを実行するため、KNOPPIX
(LIVEでターミナルでddコマンドが動くなら何でもいい)のDVDを作成し、
BIOS弄って、DVD優先起動にする。

$ sudo -s でroot化
コピー元を sda コピー先を sdbとする場合、
# dd if=/dev/sda of=/dev/sdb bs=1024
今回は、HDDにエラーが出た状態ではないので、
ブロックサイズはデフォルトの512Kごと送るよりは、倍の方が早いだろうということで、
オプションを追加。
ifとofを逆にしちゃうと、大変な事態に。もう二度とデータは帰ってこない・・・。
この作業、あんまりしたくない・・・。

結果、およそ2時間ほどでコピー完了
途中経過を確認する方法は別のターミナルを起動して
$ killall -USR1 dd
これで、その時点の作業量からおよその時間が割り出せる。

完了したら、シャットダウンして、その後HDDをつなぎかえて起動。

起動すると、外側は500GBなっているが、内側は180GBのままなので、
これを正しく直してあげる必要がある。

$ su -
# df -H
Filesystem             Size   Used  Avail Use% マウント位置
/dev/mapper/VolGroup00-LogVol00
                       168G   164G     4G  97% /
/dev/sda1              104M    64M    35M  65% /boot





現状、こんな感じ



ボリュームグループの構成を見て、割り当てられる領域を確認。
# /usr/sbin/vgdisplay -v
作業中に保存し忘れた・・・。
これは、最終形だが、
Total PEが上限値なので、その付近まで、領域を拡張すれば良い。

    Finding all volume groups
    Finding volume group "VolGroup00"
  --- Volume group ---
  VG Name               VolGroup00
  System ID           
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  6
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                2
  Open LV               2
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               168 GB
  PE Size               32.00 MB
  Total PE              14901
  Alloc PE / Size       14563 / 455.09 GB
  Free  PE / Size       338 / 10.56 GB
  VG UUID               Ys3H7T-UY61-MnKG-Ue0I-bMGI-mRHd-1oYDvm



# lvextend -l 14500 /dev/VolGroup00/LogVol00 

最初は、14500でなく、14901でコマンドを叩いたのだが、
他に使われている領域が有るらしく、エラーが出たので、
わりと近めのきれいな数値でコマンド実行した。

その結果が、上の状態。




# resize2fs /dev/VolGroup00/LogVol00
resize2fsでサイズを変更。










途中迷走し、fdiskで一端sda2を消して、Wで保存する前に、
再度、目一杯の領域でsda2を作り直してWして、
再起動したが、効果が有ったのか不明。

ほんとは、 resize2fsの前に、
#fsck -f /dev/VolGroup00/LogVol00 でディスクチェックすべきかも。
 
 
# df -H
Filesystem             Size   Used  Avail Use% マウント位置
/dev/mapper/VolGroup00-LogVol00
                       472G   164G   308G  34% /
/dev/sda1              104M    64M    35M  65% /boot

この形になれば、成功。



2014/05/05

バックアップ機のメンテナンス

過去に作っていたバックアップマシンをしばらく使っていなかったが、
メインマシンがお亡くなりになった際に、阿鼻叫喚となるので、
バックアップを現行に近づけておく。

ユーザを作る
# useradd ユーザ名

パスワード設定
# passwd ユーザ名

メイン機の環境を丸ごと圧縮取ってくる。
$ tar zcvf ユーザ名.tar.gz 

SCPで先程作ったサブマシンのユーザ配下に置き、展開

$ tar xvf ユーザ名.tar.gz

動作確認

postgreSQLが動いているか確認
$ psql データベース名
psql (8.4.7)

動いている。


Tomcatが動くか
tomcatは動くが、logにインクルードが上手くいかないと書かれている。

/home/ユーザ名/ver3/web-inf/web.xml
この中にcatalinaの定義されているものがあった・・・。

これで嵌った・・・。

iptableでポート解放して
iptable をrestartして設定反映。

tomcat起動で動いた。



2014/02/20

port解放


# nano /etc/sysconfig/iptables

# Firewall configuration written by system-config-securitylevel
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:RH-Firewall-1-INPUT - [0:0]
-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -j RH-Firewall-1-INPUT
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
-A RH-Firewall-1-INPUT -p icmp --icmp-type any -j ACCEPT
-A RH-Firewall-1-INPUT -p 50 -j ACCEPT
-A RH-Firewall-1-INPUT -p 51 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp --dport 5353 -d 224.0.0.251 -j ACCEPT

-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 53 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m udp -p udp --dport 53 -j ACCEPT


-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 14000 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m udp -p udp --dport 14000 -j ACCEPT


開けたいポートを記載する。 14000とか

ipテーブルを読み直す

# /etc/init.d/iptables restart

これで、ポート解放

複数のユーザでtomcatを動かす場合など必要だった。


2014/02/19

useraddのパスが通らない

リモートでuseraddをしたが、bash: useradd: command not found
となる。

su -
でrootにならないとpathが通らないことに気付かなかった・・・。
忘れないように残す。

OSのbit確認

$ uname -m
32bitの場合 i686
64bitの場合 x86_64
 
64bitのマシンから環境一式をコピーしたが、
移転先のOSが32bitだった・・・。 
JDKが64bitで tomcatが動いていたので、
32bitのJDKを入れないと、tomcatが動かない・・・。
startup.shでcannot execute binary fileのエラーが出ていた。
最初原因が分からなかったが、
OSが32bitだったような気がして調べたので、
コマンド載せておく。 

圧縮・解凍

圧縮
$ tar zcvf ファイル名.tar.gz 

解凍
$ tar xvf ファイル名.tar.gz

2014/02/01

Linux rsyncで差分バックアップの実装

基本的な使い方
 $ rsync -av /コピー元 /コピー先
フルパスで行けた。

差分バックアップについては、
rsync -av --delete --link-dest=../<<比較元>> <<バックアップ元>> /<<バックアップ先>>
で行ける。(比較元のパスはバックアップ先から相対パスで指定すること

cronで毎日稼働させるようであれば、次のように修正して稼働させればよい。
既に先人が偉大な資料を残してくれているので、参考に作成した。


--link-dest コマンド:インクリメンタルバックアップ
ハードリンクを作ってくれるので、ディスク圧迫を防げるので、コマンド採用している。

Webエンジニア・インフラエンジニアゐくをの日常 様のほぼそのままです。

詳しくは、この方のWEBサイトを確認してください。


□□□□□□シェルスクリプトの内容ここから□□□□□□□

#!/bin/bash

# バックアップ先を指定
back_up_dir=/<<バックアップ先のディレクトリのパス>>/dailyBack
mkdir -p $back_up_dir

# バックアップログ名
backup_log=/<<ログを残すディレクトリ>>/log/rsync_backup.log
rm -f $backup_log
touch $backup_log
chmod 600 $backup_log

# エラー処理 あった方がよさそうなので、そのまま使わせて頂いた。
error_exit () {
exit 1
}

# バックアップ実行
echo "毎日のバックアップ開始" >> $backup_log
#このあたりは素敵な感じ。当初別の方法で書いたが、ゐくをさんの方法の方が分かりやすいので、パクった。
latest=`ls -t $back_up_dir | grep backup | head -1`
newly=`date +%Y%m%d`backup

mkdir $back_up_dir/$newly
rsync -av --delete --link-dest=../$latest /<<バックアップ元のディレクトリ>> $newly/$latest >>

#ここから下もそのまま利用させて頂いた。

$backup_log 2>&1
code=$?
if [ $code -ne 0 ]; then
    cat $backup_log | mail -s "BACKUP NG CODE IS $code" root
    rm -rf $back_up_dir/$newly
    error_exit
fi
echo "毎日のバックアップ完了" >> $backup_log


□□□□□□□□ここまで□□□□□□□□□

Linux ディレクトリ・ファイル容量の確認コマンド du

dfはHDD等の利用率や容量の確認コマンド

duはカレントディレクトリの容量を調べることができる。

du --オプション ファイル名やディレクトリ 


オプション
-s 引数で指定したファイルやディレクトリの総計を表示する
-h 適当なサイズで表示 K G等
-d シンボリック・リンク・ファイルは元ファイルの容量を集計する


良く使うのはこのあたり

最初に調べたいディレクトリに移ってからコマンドを打っても良い。

du -sh

大概はこれでOK。  

2014/01/21

PostgreSQL 配列関数 複数行帰ってくるクエリを一行で表示させる表現 ARRAY関数

複数のテーブルを跨いだクエリで、selectの結果が複数行で返ってくる場合、
pg_fetch_array等で、一覧表として表現したい事がある。

通常、LEFT JOIN等を行っても、複数行がそのまま表示されてしまう。
ただ内容を見る場合は、これでも良いのだが、
pg_num_rows 等で件数を合わせて管理したい場合、カウントがおかしくなってしまう。

いろいろと探したところ、配列関数でクエリを投げれるようなので、実装した際のオボエガキ。

条件

テーブル
tab1
tab2

tab1 のカラム
seqnumber
name
add



tab2 のカラム
tab2seqnumber
number こいつもユニークでこれを軸に番号を発番している。
memo



クエリ生成

select seqnumber,
( select array_to_string(ARRAY(select number||memo from tab2
where tab1.seqnumber=tab2.tab2seqnumber ), ',') ) AS
combine,name,add from tab1 where seqnumber=7777;


このような表現でOK

大枠のクエリの抽出条件の中に、
select array_to_string(ARRAY・・・, ',' )を入れ子にしているのがポイント。

たとえば、
select seqnumber,number||memo,name,add from  tab1 left join tab2 on tab1.seqnumber=tab2.tab2seqnumber where seqnumber=7777;

この場合、3行の検索結果が返ってくるとすると、
seqnumber,101memo1,102memo2,103memo3,name,add
のように
number||memo が若い順にカンマ区切りで文字列として表示される。

何気にすごく使える。

本家の解説ページ
http://www.postgresql.jp/document/8.0/html/functions-array.html

2013/12/11

ExcelでpostgreSqlに接続しsqlを利用

手順のオボエガキ

PostgreSQLのODBCドライバをインストール
 OS(32bit) Excel(32bit)
 32bitのPostgreSQLのODBCドライバをダウンロードしインストール

 OS(64bit) Excel(64bit)
 64bitのPostgreSQLのODBCドライバをダウンロードしインストール

 OS(64bit) Excel(32bit)
 32bitのPostgreSQLのODBCドライバをダウンロードしインストール
 管理者権限でコマンドプロンプトを起動
 C:\Windows\SysWOW64\odbcad32.exe を叩き起動。
 32bitのODBCドライバを追加する。 

Excelでの設定
 データTAB→その他のデータソース→データ接続ウイザード
 →ODBC DSN→PostgreSQLのデータソースを選択

 適宜SQLを編集し、指定のセルにクエリ結果を表示させる。

以上

ODBC DSNで接続環境を作らないと不安定な接続となったので、
この方法を取る事。

2013/08/02

windows7 シンボリックリンク


Linuxで運用中のプログラムをwindows7で走らせることになった。

内部構成でシンボリックリンクを使っていたので、
同じものを配置するか~、メンテナンス性悪いな~と思っていたら、
windowsVista以降は何とシンボリックリンクが使えるらしい。
これは助かるので、忘れ無いように残す。


コマンドラインでのみ作成可能なため、コマンドプロンプトを管理者権限で起動

◆ファイルのシンボリックリンクを作成
mklink <シンボリックリンクの名前> <リンク先パス>
◆ディレクトリのシンボリックリンクを作成
mklink /d <シンボリックリンクの名前> <リンク先パス>

2013/07/23

grep 指定ディレクトリ内のファイルの中に入っている単語の検索

追記あり

grep -i -r -n -e "検索したい単語"  /検索したいディレクトリ

option

-i 大文字・小文字の区別をなくす。
-r サブディレクトリ以下も再帰的に検索する。
-n パターンに一致した行のファイル内での行番号を表示する。
-e 検索条件を指定 -e "内容" のセットで使う。

その他option
-w 指定したパターンを単語として含む行を抜き出す。
-c マッチした総行数を表示
--include='*.拡張子' 指定した拡張子を含む
--exclude='*.拡張子' 指定した拡張子を除く


応用編
find | xargs grep -n [pattern]
 
入力したパターンをカレントディレクトリ以下で検索してくれる。
最初の 
grep -i -r -n -e "検索したい単語"  /検索したいディレクトリ
ほぼ同じ。


今更だけど、option -e "" を忘れて
余計な時間が掛かったので、残す。 

2013/07/05

findコマンド 3日前のファイルを舐めて消して、バックアップを取る

シェルスクリプトを作成

#!/bin/sh
#バックアップ シェルスクリプト
#バックアップフォルダ名は、YYYY-MM-DD-HHMMとする。
#例) 2012-01-01-0100
#crontabと連携し、日数を指定する
#2日分持つ
#ほんとはコピーとデリートのシェルスクリプトを分けた方がいい。


echo "File backup start at `date`"
days=2
 

# ○日前以前にアクセスされたファイルを消す。
echo "Old backup ($days days passed) delete"
find [targetFile] -atime +$days -print -exec rm -fR {} \;

# find [検索するディレクトリ] (option) 
# -atime (+/-)n 最後にアクセスされたのが
#  n日前のファイル・ディレクトリを検索(+n:n日以上、-n:n日以下)
# 今回は -mtime +$days としているので 設定日数変更可能。
# -print     検索結果の標準出力
# -fprint [file name]     検索結果を指定したファイルに書き出す
# -exec [command] {} \;     検索結果をコマンドに引き渡して実行


#ディレクトリレベルで個別設定し新規作成が必要な場合使用
#fdir="作成するディレクトリのフルパス"
#if [ ! -e $fdir ]
#then
#    echo "create backup directory $fdir"
#    mkdir $fdir
#fi

#任意のディレクトリに 2012-01-01-0100 のディレクトリを作成する。
dName=[バックアップ先のディレクトリフルパス]`date '+%Y-%m-%d-%H%M'`

echo "Copying to the BackupFile"
#バックアップ元のディレクトリを指定
#個別で指定する場合は、複数行記述する。

cp -R [バックアップ元ディレクトリフルパス] $dName

echo "DB backup end   at `date`"