複数の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/12/02
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の前に、
Filesystem Size Used Avail Use% マウント位置
/dev/mapper/VolGroup00-LogVol00
472G 164G 308G 34% /
/dev/sda1 104M 64M 35M 65% /boot
この形になれば、成功。
もともと格安の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起動で動いた。
メインマシンがお亡くなりになった際に、阿鼻叫喚となるので、
バックアップを現行に近づけておく。
ユーザを作る
# 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が通らないことに気付かなかった・・・。
忘れないように残す。
となる。
su -
でrootにならないとpathが通らないことに気付かなかった・・・。
忘れないように残す。
2014/02/01
Linux rsyncで差分バックアップの実装
基本的な使い方
$ rsync -av /コピー元 /コピー先
フルパスで行けた。
差分バックアップについては、
rsync -av --delete --link-dest=../<<比較元>> <<バックアップ元>> /<<バックアップ先>>
で行ける。(比較元のパスはバックアップ先から相対パスで指定すること)
cronで毎日稼働させるようであれば、次のように修正して稼働させればよい。
既に先人が偉大な資料を残してくれているので、参考に作成した。
--link-dest コマンド:インクリメンタルバックアップ
ハードリンクを作ってくれるので、ディスク圧迫を防げるので、コマンド採用している。
□□□□□□シェルスクリプトの内容ここから□□□□□□□
#!/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
□□□□□□□□ここまで□□□□□□□□□
$ 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。
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
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で接続環境を作らないと不安定な接続となったので、
この方法を取る事。
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='*.拡張子' 指定した拡張子を除く
応用編
ほぼ同じ。
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`"
#!/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`"
2013/06/26
php WEBシステム クエリの結果に行数を反映させたい
クエリを投げて、複数行の結果がかえってくるような検索プログラムに、
htmlで表を使って表示させているが、その際にsequence numberを表示させたいと要望があったので、
一番簡単な方法を掲載。
while ($col = pg_fetch_array($rst)) {
$seq +=1;
whileが終わるまで、seqに+1づつしてくれます。
##PHPの内容抜粋
$body .= "<TABLE border='1'>
<TR>
<TH><font size=2>seq</font></TH>
<TH><font size=2>内容</font></TH>
</TR>";
while ($col = pg_fetch_array($rst)) {
$seq +=1;
$body .= "<TR>" .
"<TD><font size=2>$seq</font></TD>" .
"<TD><font size=2>$col[内容のカラム名]</font></TD>" .
"</TR>";
$body .= "</TABLE>";
こんな感じで使うようですね。
2013/06/24
postgresql 他の拠点(ホスト)からのアクセスを許可する設定
postgresの
/usr/local/pgsql/data/postgresql.conf を修正
listen_addresses = '*'
コメントになっている場合は、コメントを消す(#を取る)
接続ホストの制限をしている設定ファイル
/usr/local/pgsql/data/pg_hba.conf を修正
末尾に新しい拠点(ホスト)を記載。
でpostgresqlを再起動して、設定を有効にする。
/usr/local/pgsql/data/postgresql.conf を修正
listen_addresses = '*'
コメントになっている場合は、コメントを消す(#を取る)
接続ホストの制限をしている設定ファイル
/usr/local/pgsql/data/pg_hba.conf を修正
末尾に新しい拠点(ホスト)を記載。
host all all 192.168.XXX.0/24 password
補足
サブネットマスクは忘れず記載。
passwordで md5ベースのパスワード
md5は総当たりでやられるらしく、
SHA-2とかのほうがセキュアらしいが、
その辺はルーターで穴を塞いでいるので、
ローカルレベルのパスワード定義で十分。
# /etc/rc.d/init.d/postgresql restartでpostgresqlを再起動して、設定を有効にする。
2013/03/21
CentOs6.0 crontab
crontab -e でcronデーモンを登録しようとしたが、上手くいかない。
rootで/var/spool/cronの直下のユーザ名ファイルに直接書き込んだ。
これでも、良いようだ。
rootで/var/spool/cronの直下のユーザ名ファイルに直接書き込んだ。
これでも、良いようだ。
2013/03/18
CentOS6.0以降のcrontab設定
Logwatchをrpmでインストールして 、メールを携帯に飛ばして状態管理をしており、
CentOS6.0のマシンからも、メールを飛ばすようした際のオボエガキ。
CentOS6.0以降のcrontabはrootでも定義されていない。
crontabのdailyを7時半に定義したところ、
朝3時半頃と、指定した時間の2回送られてくるようになった。
All about linuxさん に解説があったので、残す。
何やら、anacron (cronie-anacron)によって、ランダム化をし、
スクリプトシェルが重なったりして実行できない等の問題を解決しているようだ。
/etc/anacrontab
これで、7時前半となる場合は、
cronie-noanacronというパッケージをインストールすると、ランダム化されないそうだ。
パッケージの依存関係のため、事前に cronie-noanacron をインストールし、
その後に cronie-anacron を削除するという手順を踏む。
cronie-anacron パッケージを削除しないと有効化されないようにガードされているそうだ。
cron.weekly および cron.monthlyも同様。
CentOS6.0のマシンからも、メールを飛ばすようした際のオボエガキ。
CentOS6.0以降のcrontabはrootでも定義されていない。
crontabのdailyを7時半に定義したところ、
朝3時半頃と、指定した時間の2回送られてくるようになった。
All about linuxさん に解説があったので、残す。
何やら、anacron (cronie-anacron)によって、ランダム化をし、
スクリプトシェルが重なったりして実行できない等の問題を解決しているようだ。
/etc/anacrontab
# /etc/anacrontab: configuration file for anacron
# See anacron(8) and anacrontab(5) for details.
SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# the maximal random delay added to the base delay of the jobs
RANDOM_DELAY=45
# the jobs will be started during the following hours only
START_HOURS_RANGE=3-22
#period in days delay in minutes job-identifier command
1 5 cron.daily nice run-parts /etc/cron.daily
7 25 cron.weekly nice run-parts /etc/cron.weekly
@monthly 45 cron.monthly nice run-parts /etc/cron.monthly
赤字の 1 (左端) が実行周期 (日時実行=1) で、
次の数字 5 は、実行開始タイミングになってから、5 分間の遅延を入れる指定
実行開始する時間帯は START_HOURS_RANGEで制御され、
3-22 とは、3時から22時までの範囲 (3:00 ≦ t < 22:00) を指定
ランダム化の幅はRANDOM_DELAY で制御され、
45 とは 0~45 分の範囲 (乱数計算の実装上、正確には 44 分まで)
でランダムに遅延を行うことを指定している。
とのこと。詳しくは、manにて
起動時間帯が、3-22時の場合は、3:05~3:50に(正確には3:06となるらしい)起動することになる。
7時半頃飛んで来ればいいので、START_HOURS_RANGE=7-22
に変更。これで、7時前半となる場合は、
1 5 cron.daily nice run-parts /etc/cron.daily
5を30とかにすれば、いいはず。cronie-noanacronというパッケージをインストールすると、ランダム化されないそうだ。
パッケージの依存関係のため、事前に cronie-noanacron をインストールし、
その後に cronie-anacron を削除するという手順を踏む。
# yum install cronie-noanacron
..略..
Installed:
cronie-noanacron.x86_64 0:1.4.4-7.el6
Complete!
# rpm -e cronie-anacron
/etc/cron.d/dailyjobsというものが生成され、こいつに、見慣れたcromtabを指定すればよい。
中身
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# run-parts
02 4 * * * root [ ! -f /etc/cron.hourly/0anacron ] && run-parts /etc/cron.daily
22 4 * * 0 root [ ! -f /etc/cron.hourly/0anacron ] && run-parts /etc/cron.weekly
42 4 1 * * root [ ! -f /etc/cron.hourly/0anacron ] && run-parts /etc/cron.monthly
cronie-anacron パッケージを削除しないと有効化されないようにガードされているそうだ。
cron.weekly および cron.monthlyも同様。
2012/10/09
Tomcat Catalina_opts
CATALINA_OPTS の設定方法
tomcatのbinにある、catalina.batの中の
set CATALINA_OPTS=CATALINA_OPTS=
" -verbose:gc -XX:+PrintGCTimeStamps -Xms1024m -Xmx1536m -XX:NewSize=170m -XX:MaxNewSize=170m -XX:SurvivorRatio=2 -XX:PermSize=64m -XX:MaxPermSize=64m"
ここの
Xmsが初期値 -Xms1024m
Xmxが最大値 -Xmx1536m
こんな感じで書く。
他の記載はそのままで問題なく動く。
OutOfMemoryが頻出の際は、メモリを買ってここを直す。
tomcatのbinにある、catalina.batの中の
set CATALINA_OPTS=CATALINA_OPTS=
" -verbose:gc -XX:+PrintGCTimeStamps -Xms1024m -Xmx1536m -XX:NewSize=170m -XX:MaxNewSize=170m -XX:SurvivorRatio=2 -XX:PermSize=64m -XX:MaxPermSize=64m"
ここの
Xmsが初期値 -Xms1024m
Xmxが最大値 -Xmx1536m
こんな感じで書く。
他の記載はそのままで問題なく動く。
OutOfMemoryが頻出の際は、メモリを買ってここを直す。
2012/03/29
PHPの日付計算
PHPの日付の記載方法を調べていたら
参考になるところを発見したので、
貼り付けておく。
http://www.ilovex.co.jp/Division/ITD/archives/2006/03/php.html
株式会社アイロベックス様の
ITプロフェッショナル部のアーカイブより発見。
PHPで1週間前の日付の取得方法がわからなかったので、
参考になるところを発見したので、
貼り付けておく。
http://www.ilovex.co.jp/Division/ITD/archives/2006/03/php.html
株式会社アイロベックス様の
ITプロフェッショナル部のアーカイブより発見。
PHPで1週間前の日付の取得方法がわからなかったので、
調べたところ下記の記述が出てきました。
↓↓↓↓↓↓↓以下PHPコード↓↓↓↓↓↓↓↓↓
//今日の日付を取得(タイムスタンプ)
$date_today = mktime (0, 0, 0, date("m"), date("d"), date("y"));
//一週間前を取得
$date_oneweek = $date_today - 86400 * 7;
↑↑↑↑↑↑↑以上PHPコード↑↑↑↑↑↑↑↑↑
86400というのが一日を表しているらしいです。
その数値×7日で一週間分の数値を求め、それを本日のタイムスタンプから引くと、
一週間前の日付が取得できるといった原理です。
確かにちゃんと動くのですが、本当にこの方法しかないのか??
と思い調べたところ違う書き方もありました。
しかも、上記の記述よりも簡単に書くことができました。
↓↓↓↓↓↓↓以下PHPコード↓↓↓↓↓↓↓↓↓
echo "1日前" . date("Y/m/d",strtotime("-1 day"));
echo "1ヶ月前" . date("Y/m/d",strtotime("-1 month"));
echo "1年前" . date("Y/m/d",strtotime("-1 year"));
echo "1週間前" . date("Y/m/d",strtotime("-1 week"));
↑↑↑↑↑↑↑以上PHPコード↑↑↑↑↑↑↑↑↑
1日前,1週間前,1年前,それに加えて1週間前もこのコードで取得できます。
上記コードだと、本日から○日後の日付が取得できますが、
次のコードだと、指定日付から○日後の日付が取得できます。
↓↓↓↓↓↓↓以下PHPコード↓↓↓↓↓↓↓↓↓
echo "1日前" . date("Y/m/d",strtotime("-1 day" ,strtotime("2005/12/10")));
echo "1ヶ月前" . date("Y/m/d",strtotime("-1 month" ,strtotime("2005/12/10")));
echo "1年前" . date("Y/m/d",strtotime("-1 year",strtotime("2005/12/10")));
echo "1週間前" . date("Y/m/d",strtotime("-1 week" ,strtotime("2005/12/10")));
注意:"2005/12/10"は適当な日付です。ここに指定したい日付を記述して下さい。
↑↑↑↑↑↑↑以上PHPコード↑↑↑↑↑↑↑↑↑
また、PHPで何か発見したら報告します。
↓↓↓↓↓↓↓以下PHPコード↓↓↓↓↓↓↓↓↓
//今日の日付を取得(タイムスタンプ)
$date_today = mktime (0, 0, 0, date("m"), date("d"), date("y"));
//一週間前を取得
$date_oneweek = $date_today - 86400 * 7;
↑↑↑↑↑↑↑以上PHPコード↑↑↑↑↑↑↑↑↑
86400というのが一日を表しているらしいです。
その数値×7日で一週間分の数値を求め、それを本日のタイムスタンプから引くと、
一週間前の日付が取得できるといった原理です。
確かにちゃんと動くのですが、本当にこの方法しかないのか??
と思い調べたところ違う書き方もありました。
しかも、上記の記述よりも簡単に書くことができました。
↓↓↓↓↓↓↓以下PHPコード↓↓↓↓↓↓↓↓↓
echo "1日前" . date("Y/m/d",strtotime("-1 day"));
echo "1ヶ月前" . date("Y/m/d",strtotime("-1 month"));
echo "1年前" . date("Y/m/d",strtotime("-1 year"));
echo "1週間前" . date("Y/m/d",strtotime("-1 week"));
↑↑↑↑↑↑↑以上PHPコード↑↑↑↑↑↑↑↑↑
1日前,1週間前,1年前,それに加えて1週間前もこのコードで取得できます。
上記コードだと、本日から○日後の日付が取得できますが、
次のコードだと、指定日付から○日後の日付が取得できます。
↓↓↓↓↓↓↓以下PHPコード↓↓↓↓↓↓↓↓↓
echo "1日前" . date("Y/m/d",strtotime("-1 day" ,strtotime("2005/12/10")));
echo "1ヶ月前" . date("Y/m/d",strtotime("-1 month" ,strtotime("2005/12/10")));
echo "1年前" . date("Y/m/d",strtotime("-1 year",strtotime("2005/12/10")));
echo "1週間前" . date("Y/m/d",strtotime("-1 week" ,strtotime("2005/12/10")));
注意:"2005/12/10"は適当な日付です。ここに指定したい日付を記述して下さい。
↑↑↑↑↑↑↑以上PHPコード↑↑↑↑↑↑↑↑↑
また、PHPで何か発見したら報告します。
登録:
投稿 (Atom)