2012年12月27日木曜日

C言語 デバッグ用マクロ

http://gcc.gnu.org/onlinedocs/gcc/Variadic-Macros.html#Variadic-Macros

#define DMSG_ERR( p_fmt, ...) printk(KERN_ERR "cpu:%d %s:%d (%s) " p_fmt, smp_processor_id(), __BASENAME__, __LINE__, __func__, ## __VA_ARGS__)
#define DMSG_WARNING(p_fmt, ...) printk(KERN_WARNING "cpu:%d %s:%d (%s) " p_fmt, smp_processor_id(), __BASENAME__, __LINE__, __func__, ## __VA_ARGS__)
#define DMSG_NOTICE( p_fmt, ...) printk(KERN_NOTICE "cpu:%d %s:%d (%s) " p_fmt, smp_processor_id(), __BASENAME__, __LINE__, __func__, ## __VA_ARGS__)
#define DMSG_INFO( p_fmt, ...) printk(KERN_INFO "cpu:%d %s:%d (%s) " p_fmt, smp_processor_id(), __BASENAME__, __LINE__, __func__, ## __VA_ARGS__)



2012年12月20日木曜日

Programing memo

・デバッグ分出力のバイナリをデフォルトで生成するようにしておく。
・いたるところに、デバッグ文出力用マクロを挿入しておく。
 どこまで通過したか判るように。



2012年12月19日水曜日

zip unzip 指定ファイルの解凍

zip unzip 指定ファイルの解凍

$ unzip archives.zip mydir/my.iso -d /home/user



(DVD)メディアのチェックサム md5sum

チェックサム md5sum

(DVD)メディアは単純にチェックサムを比較することが出来ない。
http://www.debian.org/CD/faq/index.ja.html

$ /usr/bin/isosize -x /dev/hdc
sector count: 4425, sector size: 2048
$ dd if=/dev/hdc count=4425 bs=2048 | md5sum




書き込み済みの光学メディアを検証する場合
メディアの種類によっては ISO イメージにあるものよりも多くのバイト数を返してくる可能性
この後方に付くゴミは TAO モードで書き込まれた CD、追記された DVD-R[W]、
フォーマット済みの DVD-RW, DVD+RW, BD-RE、さらに USB キーの場合不可避
ISO イメージ自体にあるのと正確に同数のセクタのデータをメディアから読み込む必要があり
メディアからそれ以上に多くのバイトを読み込んだ場合チェックサムの結果は違うものになる



2012年12月14日金曜日

環境変数

forkした子プロセスは、環境変数も引き継ぐ。
getenv
putenv
setenv
unsetenv
environ (7) 大域変数
clearenv すべての環境変数をクリアする(空にする)posixでない!?

su コマンドを '-' 付加して実行すると、環境変数は引き継がない。
シェルをログインシェルにする。


/etc/profile.d/*.sh に環境変数を設定する各種スクリプトがある。


すべての環境変数を表示する。
$ gcc -Wall -o my_printenv my_printenv.c
#include <stdio.h>

extern char **environ;

int main()
{
char **ep = environ;
char *p;

FILE *fptr;

fptr = fopen("/tmp/xxx.txt", "a");

fprintf(fptr, "-------------\n");

while ((p = *ep++))
fprintf(fptr, "%s\n", p);

fclose(fptr);

return 0;
}



2012年12月11日火曜日

2012年12月5日水曜日

特殊なデバイス

/dev/null
書き込み全て破棄、読み取りは常にEOF

/dev/zero
書き込み全て破棄、読み取りは永遠にnull文字(\0)

/dev/full
書き込みは常にエラーerrno=ENOSPC(デバイス容量FULL)、読み取りは永遠にnull文字(\0)

・異常時対応の動作テストをする際に有用
・null,zeroデバイスは書き込み無視するので、不要なI/Oを破棄する際、無用のオーバーヘッドがない手頃な方法


/dev/random (暗号用。長時間I/Oブロックの可能性アリ)
/dev/urandom (普通のアプリはこちら)
乱数生成デバイス


#include <stdio.h>
int main()
{
int value;
FILE *fptr;
unsigned int w_i;
fptr = fopen("/dev/urandom", "r");
if(fptr==NULL) { return -1; }
for(w_i=0; w_i<20; w_i++) {
fread( &value, sizeof(value), 1, fptr);
printf("%2d value = 0x%08X %u\n", w_i, value, value);
}
fclose(fptr);
return 0;
}



タイマ時間

***
*
* gcc -Wall -lrt -o clock clock.c
*
***/
/***
Linux mtlx02 2.6.18-128.el5 #1 SMP Wed Dec 17 09:03:25 PM EST 2008 x86_64 x86_64 x86_64 GNU/Linux
clock=0 sec=0 nsec=999848 分解能約1ms CLOCK_REALTIME
clock=1 sec=0 nsec=999848 分解能約1ms CLOCK_MONOTONIC
clock=2 sec=0 nsec=1 分解能1ns CLOCK_PROCESS_CPUTIME_ID (TSC)
clock=3 sec=0 nsec=1 分解能1ns CLOCK_THREAD_CPUTIME_ID (TSC)
***/
#include <stdio.h>
#include <time.h>

int main()
{
clockid_t clocks[] = {
CLOCK_REALTIME, /* システム全体の実時間(real time、wall time) */
CLOCK_MONOTONIC, /* 任意の時点からの経過時間 */
CLOCK_PROCESS_CPUTIME_ID, /* プロセス毎に使用可能なCPUが備える高分解能の時計 */
CLOCK_THREAD_CPUTIME_ID, /* プロセス毎の時計と同じだが、スレッド毎に使用可能 */
(clockid_t) -1
};

char *clocksStr[] = {
"CLOCK_REALTIME", /* システム全体の実時間(real time、wall time) */
"CLOCK_MONOTONIC", /* 任意の時点からのけ化時間 */
"CLOCK_PROCESS_CPUTIME_ID", /* プロセス毎に使用可能なCPUが備える高分解能の時計 */
"CLOCK_THREAD_CPUTIME_ID", /* プロセス毎の時計と同じだが、スレッド毎に使用可能 */
""
};

int w_i;


/* 分解能表示 */
printf("clock_getres\n");
for(w_i=0; clocks[w_i]!=(clockid_t) -1; w_i++) {
struct timespec res;
int ret;

ret = clock_getres(clocks[w_i], &res);
if(ret) {
perror("clock_getres");
} else {
printf("%30s : clock=%d sec=%ld nsec=%ld\n",
clocksStr[w_i],
clocks[w_i], res.tv_sec, res.tv_nsec);
}
} /*for(w_i)*/

/* 現在時刻表示 */
printf("clock_gettime\n");
for(w_i=0; clocks[w_i]!=(clockid_t) -1; w_i++) {
struct timespec res;
int ret;

ret = clock_gettime(clocks[w_i], &res);
if(ret) {
perror("clock_getres");
} else {
printf("%30s : clock=%d sec=%ld nsec=%ld\n",
clocksStr[w_i],
clocks[w_i], res.tv_sec, res.tv_nsec);
}
} /*for(w_i)*/

return 0;
}



Linuxハングアップ次の操作

↓下記、下の項目に行くほど程度のひどいハングアップ。

・Ctrl+q(Ctrl+sを押している場合の解除)
・Ctrl+d(入力待ちの場合、入力を終了)
・Ctrl+c(プロセスの終了)
・Ctrl+\(プロセスの終了)
・Ctrl+z(プロセスの停止)
・仮想コンソールに切り替える(X上Ctrl+Alt+F2、コンソール上Alt+F3)
・Ctrl+Alt+BackSpace(X上Xセッションを終了)
・CTRL+ALT+DEELTE(再起動)
・Alt-SysRq-s(sync) → Alt-SysRq-u(unmount) → Alt-SysRq-b(reboot) (システム再起動)
 ※sysRqキーがない場合、PrintScreenキー
・Alt+SysRq+b (syncせずに再起動)
・電源ボタンを押す(押してみる)
・リセットボタンを押す(押してみる)
・電源ボタン長押し
・コンピューターの電源OFF
・電源コードを抜く



デバッグツール debug tool

実行中のアプリケーションを外から観察するコマンド

strace システムコールをトレース(カーネルと何を話しいてるか)
ltrace 共有ライブラリをトレース(*.soと何を話しいてるか)
lsof LiSt Open Files。どのファイルを使っているか調べられる。(ファイル≒unixは全てファイル)
tracef 関数呼び出しをトレース(フリーツール!?)
ftrace 関数呼び出しをトレース(フリーツール!?)
ldd 依存ライブラリ

http://d.hatena.ne.jp/koseki2/20090619/TraceProc%29



2012年11月30日金曜日

memory leak on solaris メモリリーク

初回と、n回実行後を比較

ps -ef -o vsz,pid,args | sort -n

ps -elfLc



2012年11月23日金曜日

Google Document Spreadsheet 曜日 weekday

=IF(a2="", "", IF(WEEKDAY(a2, 2)=1, "月", IF(WEEKDAY(a2, 2)=2, "火", IF(WEEKDAY(a2, 2)=3, "水", IF(WEEKDAY(a2, 2)=4, "木", IF(WEEKDAY(a2, 2)=5, "金", IF(WEEKDAY(a2, 2)=6, "土", IF(WEEKDAY(a2, 2)=7, "日"))))))))



2012年11月20日火曜日

telnetスクリプト実行script

#!/bin/sh
#
LOG_DIR_WORK=/tmp/LOG_STAT_`/bin/date +%Y_%m_%d`
SCR_END_FLAG=/tmp/scr_end_flag

SCRIPT=`pwd`/todo_list.txt
SCRIPT_OUT=${LOG_DIR_WORK}/output.out

#rm -rf ${LOG_DIR_WORK}
mkdir -p ${LOG_DIR_WORK}

rm -f ${SCR_END_FLAG}

USLEEP_CNT=500000
TMO_CNT=10
#timeout USLEEP_CNT x TMO_CNT = 0.5s x 10 = 5s

IP_ADDR=192.168.50.1

(
# sleep 1
# 100000us 100ms x80CPU = 8s
usleep 100000
/bin/echo "< ${SCRIPT}"
( count=1 ; while test ! -f ${SCR_END_FLAG} && test $count -le ${TMO_CNT} ; do /bin/echo "host tmo count=${count}" >> `pwd`/messages_`/bin/date +%Y_%m_%d`.log ; count=$(($count+1)) ; usleep ${USLEEP_CNT} ; done ) > /dev/null
# ( count=1 ; while test ! -f ${SCR_END_FLAG} && test $count -le ${TMO_CNT} ; do count=$(($count+1)) ; usleep ${USLEEP_CNT} ; done ) > /dev/null
# original ( while test ! -f ${SCR_END_FLAG} ; do usleep 500000 ; done ) > /dev/null
/bin/echo logout
) | telnet ${IP_ADDR} | tee -a ${SCRIPT_OUT} > /dev/null

#/usr/bin/tr -d '\r' < ${SCRIPT_OUT} > ${SCRIPT_OUT}_del

#mv ${LOG_DIR_WORK} ${LOG_DIR}

rm ${SCR_END_FLAG}

exit 0


2012年11月8日木曜日

pingでチェックする

#!/bin/bash

#set -x
#set -v

TARGET_HOST="myserver"

# 1 time, no host name, timeout 1sec
/bin/ping -c 1 -n -w 1 ${TARGET_HOST} > /dev/null

if [ $? -eq 0 ] ; then
/bin/echo "Alive"
else
/bin/echo "Dead"
fi

exit 0



NFSマウントをチェックする

#!/bin/bash

result=`stat -f -L -c %T /mnt/mdir`
if test ${result} = "nfs" ; then
echo "NFS"
else
echo "NOT NFS"
fi

exit 0



2012年10月20日土曜日

telnetスクリプト実行script

telnetスクリプト実行script

#!/bin/bash

#target_host=${1}
#target_user=${2}
#target_password=${3}
target_host="myhost"
target_user="user"
target_password="password"

MY_WAIT_1s="/bin/usleep 1000000"
MY_WAIT_2s="/bin/usleep 2000000"

(
/bin/echo "open ${target_host}"

${MY_WAIT_2s}
/bin/echo "${target_user}"

${MY_WAIT_1s}
/bin/echo "${target_password}"

${MY_WAIT_1s}
# /bin/echo "/bin/date >> /home/user/user.log"
/bin/echo "myprog -option"

${MY_WAIT_1s}
/bin/echo "y"

${MY_WAIT_2s}
/bin/echo "logout"

#) | telnet
) | telnet 2>&1 | tee -a /tmp/${0}.log 1>/dev/null

exit 0



2012年10月3日水曜日

bash 乱数

#!/bin/bash

ran=${RANDOM}
n=$((ran%100))

echo ${n}

exit ${n}



2012年8月25日土曜日

netstat

ソケットの情報も表示され見づらい。
-t(tcp)、-u(udp)、-w(ICMP・RAW)

$ netstat -atuw
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 localhost:smtp *:* LISTEN
tcp 0 52 192.168.1.10:ssh 192.168.1.12:65116 ESTABLISHED


「LISTEN」はリッスン状態
 -aオプション 外部からの接続を、ポートを開放して待っているという状態

「ESTABLISHED」は、接続が成立している


LISTEN状態の接続のみを表示する「-l」
詳細な情報を表示する「-v」
インターフェイスごとのパケット統計を表示する「-i」
ネットワークの統計を表示する「-s」
マスカレード接続の表示を行う「-M」
マルチキャストのグループ情報を表示する「-g」
ルーティングテーブル情報を表示する「-r」



2012年8月11日土曜日

スレッドのスタックサイズ thread stack size

スレッドのスタックサイズ thread stack size

/***
* http://www.linuxquestions.org/questions/linux-newbie-8/default-stack-size-on-linux-glibc-pthreads-358438/
***/

#include <pthread.h>
#include <stdio.h>

int main(int argc, char *argv[])
{
size_t stacksize;
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_getstacksize (&attr, &stacksize);
printf("Default stack size = %d\n", stacksize);

}


$ gcc -o stacksize stacksize.c -lpthread
$ ./stacksize
Default stack size = 2097152



スレッドセーフでなくても良い関数

asctime()
basename()
catgets()
crypt()
ctermid() (NULL でない引き数を渡された場合)
ctime()
dbm_clearerr()
dbm_close()
dbm_delete()
dbm_error()
dbm_fetch()
dbm_firstkey()
dbm_nextkey()
dbm_open()
dbm_store()
dirname()
dlerror()
drand48()
ecvt() [POSIX.1-2001 のみ (POSIX.1-2008 で削除された)]
encrypt()
endgrent()
endpwent()
endutxent()
fcvt() [POSIX.1-2001 のみ (POSIX.1-2008 で削除された)]
ftw()
gcvt() [POSIX.1-2001 のみ (POSIX.1-2008 で削除された)]
getc_unlocked()
getchar_unlocked()
getdate()
getenv()
getgrent()
getgrgid()
getgrnam()
gethostbyaddr() [POSIX.1-2001 のみ (POSIX.1-2008 で削除された)]
gethostbyname() [POSIX.1-2001 のみ (POSIX.1-2008 で削除された)]
gethostent()
getlogin()
getnetbyaddr()
getnetbyname()
getnetent()
getopt()
getprotobyname()
getprotobynumber()
getprotoent()
getpwent()
getpwnam()
getpwuid()
getservbyname()
getservbyport()
getservent()
getutxent()
getutxid()
getutxline()
gmtime()
hcreate()
hdestroy()
hsearch()
inet_ntoa()
l64a()
lgamma()
lgammaf()
lgammal()
localeconv()
localtime()
lrand48()
mrand48()
nftw()
nl_langinfo()
ptsname()
putc_unlocked()
putchar_unlocked()
putenv()
pututxline()
rand()
readdir()
setenv()
setgrent()
setkey()
setpwent()
setutxent()
strerror()
strsignal() [POSIX.1-2008 で追加された]
strtok()
system() [POSIX.1-2008 で追加された]
tmpnam() (NULL でない引き数を渡された場合)
ttyname()
unsetenv()
wcrtomb() (最後の引き数が NULL の場合)
wcsrtombs() (最後の引き数が NULL の場合)
wcstombs()
wctomb()



getconf システム構成変数値

http://publib.boulder.ibm.com/infocenter/pseries/v5r3/index.jsp?topic=/com.ibm.aix.cmds/doc/aixcmds2/getconf.htm
getconf システム構成変数値



2012年8月8日水曜日

atコマンド

$ at -t 201208071630
at> pkill myprog
at> reset
at> unsetmyprog
at> <EOT> ★CTRL+D
job 19 at 2012-08-07 16:30
$



プロセスやリソースをモニタログするスクリプトbash

sysstat は、システムリソースを監視する機能やツールを提供するパッケージ
iostat、pmstat、sar等が利用できる。
$ rpm -q sysstat(インストールされているかの確認)

memo
pidstat(標準ではないかもしれない)
すべてのプロセスについて、プロセス毎にCPU使用率に関する情報を表示など。


#!/bin/bash

# sec
interval=1

target_app="myprog"
log_file="$0_`/bin/date "+%Y-%m-%d_%H_%M_%S"`.log"
#echo $log_file

#rm -f $0.log


while true
do

/bin/echo "-------------------------------------------------------------------------------------------" >> ${log_file}
/bin/date "+%Y-%m-%d %H:%M:%S" >> $log_file
ps auxww -L | head -1 >> $log_file
ps auxww -L | egrep ${target_app} | egrep -v "tail|grep|emacs" >> $log_file
vmstat >> $log_file
free >> $log_file
top -b -n 1 -c H >> $log_file

sleep $interval

done



2012年7月26日木曜日

bash for loop ループ

bash for loop ループ

#!/bin/bash

#set -x

# NG LOOP_LIMIT=200

for i in {1..200}
do
echo "Welcome $i times"
done

exit 0



2012年7月12日木曜日

grepコマンド

psコマンドの結果からgrepコマンド自身を除外する。
;-) $ ps aux myprocess |grep [m]yprocess
"myprcess"文字列を検索する。
grepコマンド自身の"[m]yprocess"文字列は、"myprocess"には一致しない。。

:-( $ ps aux myprocess |grep -v grep

http://www.commandlinefu.com/commands/view/11660/grep-processes-list-avoiding-the-grep-itself?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+Command-line-fu+%28Command-Line-Fu%29


grepコマンドで検索該当行の前後も表示させる方法

該当行の前後n行も表示
$ grep -n keyword file.txt
$ grep -C n keyword file.txt



該当行の後n行も表示
$ grep -A n keyword file.txt


該当行の前n行も表示
$ grep -B n keyword file.txt



該当行の後m 前n行も表示
$ grep -A m -B n keyword file.txt



http://www.atmarkit.co.jp/flinux/rensai/linuxtips/137greplineplus.html



2012年7月6日金曜日

gdbの使い方

http://www.debian.org/doc/manuals/debian-reference/ch11.ja.html
(gdb) thread apply all bt マルチスレッドプログラムの全てのスレッドのバックトレースを取得
(gdb) bt full 関数コールのスタック上に来たパラメーターを取得
(gdb) thread apply all bt full 異常のオプションの組み合わせでバックトレースとパラメーターを取得
(gdb) thread apply all bt full 10 無関係の出力を切り最後の10のコールに関するバックトレースとパラメーターを取得
(gdb) set logging ongdb アウトプットをファイルに書き出す (デフォールトは "gdb.txt")
---------------------------------------------------------------------------------------------------------------------------

http://uguisu.skr.jp/Windows/gdb.html
info stack 関数の呼び出しスタックの一覧を表示
info thread 存在しているスレッドの一覧を表示

詳細を知りたいスレッドは、スレッド番号を選択し、where や up コマンドで確認します。
(gdb) thread(一覧表示)
(gdb) thread 3
(gdb) where / bt
(gdb) up 2

1つのコマンドを複数のスレッドに対して実行するコマンドは
「thread apply [threadno] [all] args」です。

全スレッドの callstack を表示するには次のように入力します。
(gdb) thread apply all info stack


gdb を起動した後に動的に coreファイルを生成。
(gdb) help generate-core-file



core dump を有効化する
$ limit coredumpsize (サイズ)


deadlock した場合の coreファイルの生成方法
core dump を有効化しておき、別 terminal から signal を送って core を吐かせます。
% ps -aux | grep (デバッグしたい実行ファイル)
(実行ファイル の プロセスID を調べる)

% kill -3 (プロセスID)<pid>
「-3」は「-ABRT」でも同じです。


core の利用方法
(gdb) gdb 実行ファイル coreファイル


core dump からの thread backtrace 取得
取得した core を利用し、segfault (or deadlock) 発生時の状況を gdb で解析できます。

% gdb 実行ファイル core.<pid>
...
(gdb) set logging file <ログファイル名>
(gdb) set logging on
(gdb) thread apply all bt → 全スレッド表示
(gdb) set logging off
(gdb) quit



実行中に deadlock してしまった場合
実行中に deadlock してしまった場合、gdb を attach し、backtrace を取る。

% ps auxww | grep 実行ファイル → 実行ファイルの pid を調べる
% gdb 実行ファイル
(gdb) attach <実行ファイル の pid>
...
(gdb) set logging file <ログファイル名>
(gdb) set logging on
(gdb) thread apply all bt
(gdb) set logging off
(gdb) quit




nm コマンドを使う

$ nm -D libuXXX.so
「.so」ファイルの場合には「-D」オプションを付けることでダイナミックシンボルが表示できます。

仮に「シンボルがありません」と表示される場合は、ビルドオプションに「-gが付いている」「strip されていない」などを確認してください

小文字はそのシンボルがローカルであることを意味し、 大文字はそのシンボルがグローバル (外部定義) であることを意味します。

T コードセクション内の定義
D 初期化されたデータセクション
B 初期化されないデータセクション
U 未定義。シンボルはライブラリによって使われているが、ライブラリ内では定義されていない
W weak. 他のライブラリも同じシンボルを定義している場合、その定義によりオーバーライドされる

lddコマンドによる依存ファイル一覧

$ ldd 実行ファイル
プログラムヘッダ構造

$ strace 実行ファイル
システムコールのトレース結果

$ readelf -l 実行ファイル





・コアファイルを出力できる様にするには
 確認&変更:
  >limit
  coredumpsize 0 kbytes
  >limit coredumpsize unlimited
  >limit
  coredumpsize unlimited
 
 デバッグ:
  >gdb myprog core.16171
  (gdb) where



乱数発生器 /dev/randam

#include <stdio.h>

int main()
{
int value;
FILE *fptr;
unsigned int w_i;

fptr = fopen("/dev/urandom", "r");
if(fptr==NULL) { return -1; }


for(w_i=0; w_i<20; w_i++) {
fread( &value, sizeof(value), 1, fptr);
printf("%2d value = 0x%08X %u\n", w_i, value, value);
}

fclose(fptr);

return 0;
}



2012年7月5日木曜日

プロセスの使用メモリ(VSZ,RSS)をモニタログするスクリプトbash

プロセスの使用メモリ(VSZ,RSS)をモニタログするスクリプトbash

#!/bin/bash

interval=3

rm $0.log

/bin/date "+%Y-%m-%d %H:%M:%S" >> $0.log
ps aux | head -1 >> $0.log
while true
do

ps aux | grep mydaemon | grep -v grep >> $0.log

sleep $interval

done



フォルダサイズ ファイルサイズを調べる

フォルダサイズ
$ du -k [directory] | sort -n | tail -20

1Mより大きいファイル
$ find ./ -size +1M



2012年7月3日火曜日

Windows7 タスクバー インジケーターにアイコンが表示されない

Windows7 タスクバー インジケーターにアイコンが表示されない

tetatermmenuが表示されず、リストの設定ができない!
1.Windows7のスタートアップの登録を止める
2.Windows7(再)起動
3.手動でteratermmenu起動
これで表示された。



ntp 確認

ntpの動作を確認する方法

# /usr/sbin/ntpq -p
remote refid st t when poll reach delay offset jitter
==============================================================================
doga.jp .STEP. 16 u - 64 0 0.000 0.000 0.000
7c2955ab.i-revo .STEP. 16 u - 64 0 0.000 0.000 0.000
103.6.16.254 .STEP. 16 u - 64 0 0.000 0.000 0.000
*192.168.50.1 LOCAL(0) 11 u 23 64 17 0.136 1.028 0.933
#



2012年6月14日木曜日

syslog /var/log/messages にログする方法

$ logger System rebooted for hard disk upgrade
# tail -f /var/log/message

http://www.cyberciti.biz/tips/howto-linux-unix-write-to-syslog.html

loggerコマンドへパイプ|で渡す
* * * * * /path/to/command 2>&1 | logger -t mycommand -p local0.info



2012年6月7日木曜日

lsof ファイル ソケット open

/usr/sbin/lsof

file、socketをopenしているプロセスを表示する。



2012年6月5日火曜日

redhat5スクリーンショット

$ gnome-screenshot --delay=5

撮影後保存ウィンドウが開く、形式はpgn

--windowフォーカスを持つウィンドウのスクリーンショットを取得します。

http://library.gnome.org/users/user-guide/stable/tools-screenshot.html.ja

KDEは、ksnapshotらしい。



ping スクリプト

#!/bin/sh


# require a list file of ipaddress
# ./ipaddress_list.txt
#1.2.3.4
#192.168.50.1
#10.1.2.3

# http://www.unix.com/shell-programming-scripting/16489-help-ping-host-alive-not.html

PING_WAIT_TIME=1
PING_NUM_PCKT=1
FILE_IPADR="./ipaddress_list.txt"

for ipadr in $(cat $FILE_IPADR)
do
ping -w $PING_WAIT_TIME -c $PING_NUM_PCKT $ipadr > /dev/null

if [ $? -eq 0 ]
then
echo "$ipadr is alive."
else
echo "$ipadr is dead"
fi
done



2012年6月2日土曜日

コンパイル時にdefine定義を表示する

コンパイル時にdefine定義を表示する

#warning (-o-)(-o-)(-o-) SIZ SYS 512 = SIZ_SYS_512 (-o-)(-o-)(-o-)
#warning (-o-)(-o-)(-o-) NUM SYS 512 = NUM_SYS_512 (-o-)(-o-)(-o-)
#warning (-o-)(-o-)(-o-) PMA SYS 512 = PMA_SYS_512 (-o-)(-o-)(-o-)
#warning (-o-)(-o-)(-o-) PMS SYS 512 = PMS_SYS_512 (-o-)(-o-)(-o-)

#errorで表示させてコンパイル止めてもok。



2012年5月30日水曜日

xargsの使い方

1.標準入力から次々と行を読み込む
2.終端に達するか、コマンドに与えられる引数に等しい数に達するまで続ける
3.読んだデータを引数に与えられたコマンドを起動する
4.標準入力からまだ読めるデータがあれば 1.へ



基本
find . -not -name '*.bz2' | xargs bzip2

応用
find . -not -name '*.bz2' | xargs -L 1 -P 2 bzip2
最大2プロセスで実行し(-P 2)、各プロセスには引数を1つずつ与える(-L 1)。

注意点。
xargsで起動されるコマンドが軽い、かつ引数の数が多い場合、
並列実行によるメリットよりもコマンド起動回数(fork回数)によるデメリットの方が上回る可能性が高い。
-L で指定する数を多くするなどして対処。

参考 thanx
http://d.hatena.ne.jp/tagomoris/20110513/1305267021


見つけたファイルをコピー
find ./ -name '*.txt' | xargs -I % -t cp -p % mydir



2012年5月22日火曜日

coredump設定

csh系
coredumpファイル生成する unlimit coredumpsize
coredumpファイル生成しない limit coredumpsize 0

bash
ulimit -c unlimited



2012年5月18日金曜日

プロセスグループをkill killpg

#include <stdio.h>
#include <signal.h>
#include <errno.h>
#include <stdlib.h>

int main()
{
int pgrp;
int sig = SIGKILL;
int status;

printf("PPID = ");scanf("%d", &pgrp);

status = killpg(pgrp, sig);
if(status) {
printf("Error status=%d errno=%d\n", status, errno);
exit(1);
}

return 0;
}



coredumpコアダンプ segmentation fault プログラム

coredump コアダンププログラム

#include <stdio.h>

int main()
{
*(int *)0x0 = 1;

return 0;
}



segmentation faultプログラム
#include <stdio.h>
#include <stdlib.h>

int main()
{
abort();

return 0;
}



2012年5月12日土曜日

シェル bash if文 結果

#!/bin/sh

STRINGS="findstrings"

grep $STRINGS log.log
result=$?
echo "grep result=$result"

if [ $result -ne 1 ]
then
/bin/echo "########## ERROR ##########"
exit 1
fi

exit 0



スクリプト bash ランダムにsleepする

スクリプト bash ランダムにsleepする

1秒~10.99秒sleepウェイトする

#!/bin/bash


#DICE=$(((RANDOM%6)+1))
#DICE=$(((RANDOM%1000)+1)) # 1-1000
#DICE=$((RANDOM%1000)) # 0-999
DICE=`expr $RANDOM % 1000` # 0-999
echo "DICE=$DICE"

#wait_s=$(printf %.3f `echo $DICE/100 | bc -l`)
#echo $wait_s

wait_us=`expr $(echo $DICE*10000 | bc -l) + 1000000` # 1s-10.99s
echo "Sleep $wait_us [us] (-.-)Zzz..."


# for debug
read START dummy < /proc/uptime
#echo $START

usleep $wait_us

# for debug
read END dummy < /proc/uptime
#echo $END

echo -n "(@o@)! Elaps [s] = "

# for debug
echo $END-$START | bc -l

exit 0



2012年4月28日土曜日

rpm トラブル Pkg削除できない

(エラー)
# rpm -e MyPkg
現状、MyPkg Package には対応してません
error: %preun(MyPkg) scriptlet failed, exit status 1
#

(対処)
rpm -e --noscripts MyPkg



2012年3月7日水曜日

デバッグ strace

# /usr/bin/strace -f -tt -o strace.log mydaemon -debug

# /usr/bin/strace -f -tt -o strace.log -p `pgrep mydaemon`

-f…forkも対象
-F…obsoleteなオプション
-t/-tt/-ttt タイムスタンプ



2012年2月29日水曜日

fuser ファイルやソケットを使用しているプロセスを特定する

fuser

ファイルやソケットを使用しているプロセスを特定する

引数としてわたされたファイルやファイルシステムを使用しているプロセスの PID を表示する。



2012年2月22日水曜日

ファイル日付タイムスタンプ変更

日付の元ファイル作成
touch -d "1 jan 2012 10:00am" older_30.txt


日付の元ファイルを利用して日付タイムスタンプ変更
touch -r older_30.txt dummy.txt



参考
http://www.atmarkit.co.jp/flinux/rensai/linuxtips/265cngfdate.html

 -a最終参照日時を変更する
 -m更新日時を変更する
 -r指定したファイルと同じ日時にする
 -dファイルの日時を指定した時刻に設定する


$ touch -a file1.txt ←最終参照日時を現在の日時に変更
$ touch -r file1.txt -m file2.txt ←更新日時をfile1.txtと同じに変更
$ touch -d "2 February 2002 10:00am" file1.txt ←更新・最終参照日時を2002年2月2日の午前10時に変更



2012年2月15日水曜日

プロセスモニタ

プロセスをモニタする。

#!/bin/bash

interval=3 # 3sec


while true
do
isAlive=`/usr/bin/pgrep -f "mydaemon -debug"`
#echo $isAlive

if [ "$isAlive" = "" ]; then
#echo "Dead"
break;
fi
#else
#echo "Alive"
#fi

sleep $interval

done



2012年2月8日水曜日

sudo 設定と使用方法

設定

# /usr/sbin/visudo

## Allow root to run any commands anywhere
root ALL=(ALL) ALL
user ALL=(ALL) ALL ←追加



使用方法

$ sudo ls -l
パスワード: ←userのパスワード



firewallの設定参照 iptables

(フィルタ)
/sbin/iptables -t filter -L -n -v
-t filter:filter参照
-L:全てのチェイン(チェイン指定なし)
-n:ホスト名・ネットワーク名・サービス名で表示しない
-v:詳細

(NAT)
/sbin/iptables -t nat -L -n -v
-t nat:NAT参照
-L:全てのチェイン(チェイン指定なし)
-n:ホスト名・ネットワーク名・サービス名で表示しない
-v:詳細