tomimemo

linuxメモ

最終更新:

匿名ユーザー

- view
管理者のみ編集可

sed でhogeファイル内の空行を削除してhogehogeとして出力

# sed '/^\r/d' hoge > hogehoge

カレントディレクトリのファイル数を調べる

# find . -type f | wc -l
    99    ← 99個のファイルがある

viの使い方

ファイル開きたい場合は
# vi ファイル名
viには編集モードとコマンドモードがある。ファイル開いた時点ではコマンドモード。編集モードに移行する場合は「i」等のキーを押す。以下コマンド一覧。
[終了]
:q   セーブせずに終了
:q!  変更した行もセーブせずに終了
:w   セーブするが終了しない
:wq  セーブして終了(Shift+ZZでも同じ)

[編集モードへ移るためのキー]
i 現在のカーソル位置から挿入
R 現在のカーソル位置から置換
A 現在行の末尾に追加
O 現在行の前に行挿入
o 現在行の次に行挿入

[カーソル移動キー]
h(←) 左
j(↓) 上
k(↑) 下
l(→) 右
0 行頭へ
$ 行末へ
[Enter] 次の行の先頭へ
w 次の単語へ
b 前の単語へ
ctrl + f 次画面へ
ctrl + b 前画面へ
1G 文頭へ
G 文末へ
nnG nn行目へ

[変更キー]
x 1文字削除
dd 1行削除(カット)
cw(Change Word) 1語変更
c$ カーソル位置から行末まで変更
dw(Delete Word) 1語削除
d$ カーソル位置から行末まで削除

[検索]
/正規表現 前方検索 
?正規表現 後方検索 
n 次の候補 
N 前の候補 

[置き換え]
:1,$s/正規表現/置き換え文字列/g
  文書内の全ての「正規表現」を「置き換え文字列」に置換

[コピー&ペースト]
yy 1行コピー
dd 1行カット
p ペースト(張り付け)

[その他]
.(ドット) 直前の変更操作の繰り返し 
u 直前の変更操作の取り消し(何回でも戻れる)
:r xxx ファイル xxx の内容を次の行に挿入
:r! xxx OSのxxxコマンドを実行しその結果を次の行に挿入
:h 日本語マニュアルを表示 

viエディタ使用時に行番号を表示させる

viを起動後に行番号を表示させる
viでhoge.txtを開く
# vi hoge.txt
以下コマンドを打ち込んでエンターキー
:set number
起動と同時に行番号を表示させるには以下のようにホームディレクトリに .exrc ファイルを作成すればOK。
# echo "set number" >> ~/.exrc

シェルスクリプト

例えば、apache子プロセスのinterrの数を表示するシェルスクリプト
# vi test.sh
以下記述。
#!/bin/sh
declare -i interrcount
interrcount=`ps lax | grep httpd | grep interr -c`
echo $interrcount

権限の変更
# chmod u+x test.sh

実行
# ./test.sh
if文の書き方は以下。if文の[]とコマンドの間に半角スペース空けないとエラーになる。しばらくはまった。
if [ コマンド ]; then
  なにかコマンド
elif [ コマンド ]; then
  なにかコマンド
else
  なにかコマンド
fi

apacheが謎のinterr子プロセスを吐き出してサーバ停止になってしまう状況が起きた。今は落ち着いているものの、いつまた起こるかわからないのでシェルスクリプトを使ってプロセスの監視を行うことにした。ファイル名はprocesswatch.sh。
#!/bin/sh
# 整数宣言
declare -i interrCount 
# 無限ループ
while true
do
  # psコマンドでhttpdプロセスのinterrの数を取得
  interrCount=`ps lax | grep httpd | grep interr -c`
  # interrの数が30以上だったらapacheを再起動
  if [ $interrCount -gt 30 ]; then
    /usr/local/apache2/bin/apachectl restart
  fi
  # 5秒おきに監視
  sleep 5s
done

---- ファイルここまで

権限の変更
# chmod u+x processwatch.sh

バックグラウンドで起動
# ./processwatch.sh &
停止する場合は psコマンドでpid調べてkill。

指定したプログラムのpidを取得するシェルスクリプト。たとえばhttpdプロセスのpidを取得する場合は以下。
#!/bin/sh
PID=`/bin/ps -aefw | grep httpd | awk '{print $2}'`
echo $PID
↑だと結果が一行に表示されてしまうのでこっちに修正
#!/bin/sh
PID=`ps aux | grep httpd | awk '{print $2}'`
echo $PID

rsyncによるデータバックアップ

異なるマシン同士で簡単にバックアップを取るコマンドにrsyncというのがある。
以下、rsyncの設定手順。(SSHを使わない場合)
参考 http://www.asahikawahigashi-h.ed.jp/kohmusystem/rsyncd.html

まず、バックアップしたいファイルがあるサーバの設定。(ここではDBサーバとか)

ログファイルの吐き出し設定。
/etc/syslog.confを編集して以下追記。
# vi /etc/syslog.conf
local5.*     /var/log/rsyncd.log

次に、rsyncd.confを以下の内容で作成。(新規で作成)
# vi /etc/rsyncd.conf
pid file = /tmp/rsyncd.pid # rsyncデーモンのプロセスID書きこみ場所
syslog facility = local5   # ログ書きこみ場所
read only = false          # サーバへのデータ書きこみ許可

[db_backup_module]         # rsyncクライアントからアクセスするモジュール名
path=/usr/local/pgsql/data/# バックアップ対象ディレクトリ
comment=backup db          # コメント。なんでもいい
uid = root                 # このモジュールでデータ転送するときのユーザ名
gid = root                 # 同じくグループ名
use chroot=false           # ファイル転送する前にpathでchrootするかどうか
secrets file=/etc/rsyncd.secrets # 認証で使われるパスワードファイル
auth users=root            # 接続を許可するユーザー名(なんでもいい)
hosts allow = 192.168.0.100# 接続を許可するクライアント機のIPアドレス
hosts deny  = *            # 上記IP以外は拒否にする

次に パスワードファイル /etc/rsyncd.secretsを作成。
# vi /etc/rsyncd.secrets
root:hogehogepassword

設定ファイルとパスワードファイルの権限を変更。
# chmod 600 /etc/rsyncd.conf
# chmod 600 /etc/rsyncd.secrets

rsyncサーバを起動する。ポート873で待ち受け。しばらくdeamonと記述してたせいで、なかなか動かなかったorz
# /usr/bin/rsync rsyncd --daemon --config=/etc/rsyncd.conf --port=873

上記コマンドを/etc/rc.d/rc.localに以下追記して自動起動設定する。
# vi /etc/rc.d/rc.local
/usr/bin/rsync rsyncd --daemon --config=/etc/rsyncd.conf --port=873

バックアップファイル保存サーバ(rsyncクライアント)の設定。

まず、バックアップファイル保存ディレクトリの作成。どこでもいい。
# mkdir /backup

rsyncするときに使うパスワードファイルを作成する。
もちろん、上で設定したパスワードと同じにすること。
# vi /etc/rsyncd.pass
hogehogepassword

パスワードファイルの権限を変更。
# chmod 600 /etc/rsyncd.pass

取得除外対象ファイルの作成。別にいらないっちゃいらない。
とりあえずlogファイルは取らないようにしてみる。
# vi /etc/rsyncd.exclude
*.log

ここまでで、とりあえず設定終了。
rsyncクライアントから以下のコマンドを投げてみる。
# rsync --port=873 -avz --password-file=/etc/rsyncd.pass \
--exclude-from=/etc/rsync.exclude \
rsync://root@(DBサーバのIPアドレス)/db_backup_module /backup/

おお、ファイル一覧が表示されて、取れてる取れてる...ちなみにコマンド2回目以降は、新しく追加されたファイルや更新されたファイルのみ勝手に取得してくれるので便利。

ついでにcrontabに登録して、自動でバックアップとる設定にする。ここでは毎日午前3時30分にバックアップを取る。
# crontab -e
(1行で書く)
30 3 * * * root /usr/bin/rsync --port=873 -avz 
--password-file=/etc/rsyncd.pass 
--exclude-from=/etc/rsync.exclude 
rsync://root@(DBサーバのIPアドレス)/db_backup_module /backup/

コマンド制覇への道


redhat linux enterprise 3.0インストールメモ

インストールするマシンはDELL PowerEdge SC420(win2000が入っている)。

インストールCD-ROMをマシンに入れて電源ON。いろいろエンターキーを押しまくってGUIベースのインストール画面に到達。言語・マウス・キーボードを設定。

「ディスクパーティションの設定画面」で「自動パーティション設定」を選択したところ「新規ファイルシステム作成のための有効なデバイスが見つかりません」のエラーが出て落ちた。
今度は「ディスクパーティションの設定画面」で「Disk Druidを使用して手動パーティション設定」を選択するが、同じエラーで落ちる。

いろいろ調べていると、どうやらハードディスクがSATAであるのが問題とのこと。DELLのHPに行って、ata_piix-0.93c-1c.tar.gz というドライバをダウンロード。

解凍すると、中に8個のファイル。
ata_piix-0.93c-dd-rhel3-i386-GU1U2.img
ata_piix-1.00b-dd-rhel3-x86_64-U2.img
ata_piix-0.93c-1dkms.noarch.rpm
ata_piix-0.93c-1dkms.src.rpm
ata_piix-1.00b-1dkms.noarch.rpm
ata_piix-1.00b-1dkms.src.rpm
dkms-1.10-1.noarch.rpm
README
READMEを読むと、「ata_piix-xxx.imgをフロッピーに作成してなんたら」と書いてあったので、既存で動いているlinuxマシンを使ってフロッピーにimgファイルを作成。一番上のファイルをとりあえず使ってみた。
# dd if=ata_piix-0.93c-dd-rhel3-i386-GU1U2.img of=/dev/fd0
しばらく待つとフロッピーが作成されたのでもう一回DELLマシンを起動、今度は起動するときに linux dd と入力して、ドライバインストールモード?で起動。

fd0とhdaの選択を迫られたので迷わずfd0を選択。作成したフロッピーを入れて「OK」ボタン。Errorになった。何故だorz

今度は ata_piix-1.00b-dd-rhel3-x86_64-U2.img をフロッピーに作成してもう一回チャレンジ。...Error...

またいろいろ調べていくと、どうやらrawriteというwindowsでもimgファイルが作成できるツールがあることを発見。
ftp://ftp.kddlabs.co.jp/pub/Linux/packages/RedHat/redhat/linux/9/en/os/i386/dosutils
こいつを落としてきてc:\aaaというフォルダに配置。ついでにさっき展開したimgファイルも同じフォルダに配置。

コマンドプロンプトで以下入力。
cd c:\aaa
rawrite
Enter disk image source file name: xxx.img
Enter target diskette drive: A:
エンターキー押す
おお、作成されている。

しばらくして作成されたので、再度DELLマシンを linux dd で起動。作成されたフロッピーを入れて「OK」おしたら..何故か今度はerrorにならずインストールされた。何故だ?

再度linuxインストール開始。問題の「ディスクパーティションの設定画面」で「自動パーティション設定」を選択...おお!エラーにならない!
ということで先に進めた。

コマンド

日本語を扱う
export LANG=ja_JP.eucJP
export JLESSCHARSET=japanese 
または
setenv LANG ja_JP.eucJP
setenv JLESSCHARSET japanese 
※よく分からなかったら両方打ち込む

ファイルをある条件で検索してひっかかったら削除
・/usr/local/hoge/以下のディレクトリ
・拡張子がlogのもの
・最後に手が入った日付が7日前

上記条件の場合、以下のコマンドで対象ファイルを消せる。
# find /usr/local/hoge/* -name "*.log" -atime +7 -exec rm {} \;
削除じゃなくて圧縮の場合は以下
# find /usr/local/hoge/* -name "*.log" -atime +7 -exec gzip {} \;

フロッピーを使う(マウント)
# mount -t vfat /dev/fd0 /mnt/floppy
# ls /mnt/floppy
マウントしたあとはアンマウントして取り出す。
# umount /dev/fd0

sshを使えるようにする
# /etc/init.d/sshd start

シャットダウン(後、システム停止)
# shutdown -h now

ポートを開ける
rootでログイン
# redhat-config-securitylevel-tui
カスタマイズを選択
その他のポートにあけたいポート番号を記述->OK
->OK
で、OK。

ユーザ追加
# useradd hoge
hogeユーザが追加される

ユーザ削除
# userdel hoge
hogeユーザが削除される
/home 以下のディレクトリも同時に削除したい場合は
# userdel -r hoge

hogeユーザのパスワードを変更する
# passwd hoge

iptablesの使い方

redhat-config-securitylevel-tui でポートを空けると楽だけど、iptables使ったほうがいいのかもしれないので、iptables使ったポートの空け方をメモ。

まず、現在のiptablesの内容を保存しておく。
保存しておけばもとに戻せるので。
ここでは/etc/にiptables.save という名前で保存。
# iptables-save > /etc/iptables.save

もとに戻すときは
# iptables-restore < /etc/iptables.save

ポートを空ける作業開始。ここではpingとsshの22番とpostgresql用ポートの5432を空ける。まず、ポリシーを設定。
INPUTを全部許す。
# iptables -P INPUT ACCEPT
FORWARDは全部無効。
# iptables -P FORWARD DROP
OUTPUTは全部許す。
# iptables -P OUTPUT ACCEPT

設定を一旦クリアー。
# iptables -F

ポートの設定。
pingと自端末からの入力を許可
# iptables -A INPUT -p icmp -j ACCEPT
# iptables -A INPUT -i lo -j ACCEPT

sshを許可
# iptables -A INPUT -p tcp --dport 22 -j ACCEPT

postgresqlを許可
# iptables -A INPUT -p tcp --dport 5432 -j ACCEPT

TCPの接続開始と応答、FTPデータなどを許可 
# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

他の接続は全て破棄
# iptables -P INPUT DROP

設定を保存する。
# /etc/init.d/iptables save

一応再起動。
# service iptables restart

iptables -L コマンドで有効になっているか確認して終了。

不要なサービスを止める

電源管理ユーティリティ
# chkconfig --level 3 apmd off
atコマンドで指定した時刻にコマンドを実行する
# chkconfig --level 3 atd off
かな漢字変換サーバ
# chkconfig --level 3 canna off
印刷システム
# chkconfig --level 3 cups off
# chkconfig --level 3 cups-config-deamon off
マウス制御
# chkconfig --level 3 gpm off
外部機器接続時に動く????
# chkconfig --level 3 haldeamon off
Internet Intranet Input Method Protocol????
# chkconfig --level 3 iiim off
マルチCPU環境で使う 1CPUマシンでは意味なし
# chkconfig --level 3 irqbalance off
ISDNカード接続用スクリプト
# chkconfig --level 3 isdn off
追加もしくは取り外されたハードウェアに関連した設定を変更する
# chkconfig --level 3 kudzu off
AppleのRendezvousのために利用(internetServer目的なら不要らしい)
# chkconfig --level 3 mDNSResponder off
ソフトウェア RAID の監視と管理用
# chkconfig --level 3 mdmonitor off
NFS、sambaの自動マウント
# chkconfig --level 3 netfs off
NFSでファイルロックを行うためのサービス
# chkconfig --level 3 nfslock off
ネットワークアダプタ監視デーモン
# chkconfig --level 3 nifd off
PCカードのデバイスドライバをロードする
# chkconfig --level 3 pcmcia off
RPC接続をTCPのポートにマッピングする
# chkconfig --level 3 portmap off
アップデート情報を一定時間ごとにチェック
# chkconfig --level 3 rhnsd off
RPCと呼ばれる通信の仕組みで使われる
# chkconfig --level 3 rpcgssd off
# chkconfig --level 3 rpcidmapd off
# chkconfig --level 3 rpcsvcgssd off
メール配送(qmailとか使う場合)
# chkconfig --level 3 sendmail off
X用フォントサーバ
# chkconfig --level 3 xfs off
管理下に置かれたサービスの起動などを制御
# chkconfig --level 3 xinetd off

ホスト名の変更(redhat linux)

以下の二種類のファイルを変更
# cat /etc/hosts
# Do not remove the following line, or various programs
# that require network functionality will fail.
127.0.0.1 localhost.localdomain localhost
192.168.0.175 xxxxxxx

# cat /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=xxxxxxx
GATEWAY=192.168.0.1

変更後は、ネットワークデバイスを再起動。
# /etc/rc.d/init.d/network restart

※つうか、# hostname xxxxxxxxx でいいんじゃない?