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月27日木曜日
C言語 デバッグ用マクロ
2012年12月20日木曜日
2012年12月19日水曜日
(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日金曜日
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
#
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日水曜日
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()
2012年8月8日水曜日
プロセスやリソースをモニタログするスクリプト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
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日木曜日
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日水曜日
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:詳細