「Linux/雑記」の版間の差分

提供: Wikinote
移動: 案内検索
(覚え書き)
(リダイレクトの謎)
行169: 行169:
 
うむむむむ、これは何か「エラーは早く表示すべき」みたいなバイアスがかかってるのか…。
 
うむむむむ、これは何か「エラーは早く表示すべき」みたいなバイアスがかかってるのか…。
 
glibc が怪しいので、ソースでも見てみるか。
 
glibc が怪しいので、ソースでも見てみるか。
 +
 +
2009/06/30
 +
少し追ってみたが、glibc 全然読めん…。ただ、気になったのはここ
 +
 +
"libio/stdfiles.c"
 +
DEF_STDFILE(_IO_2_1_stdin_, 0, 0, _IO_NO_WRITES);
 +
DEF_STDFILE(_IO_2_1_stdout_, 1, &_IO_2_1_stdin_, _IO_NO_READS);
 +
DEF_STDFILE(_IO_2_1_stderr_, 2, &_IO_2_1_stdout_, _IO_NO_READS+_IO_UNBUFFERED);★
 +
 +
_IO_UNBUFFERED というフラグが立っているようだ。
 +
なるほど、通常 fwrite() で使われるバッファを経由しないから、順番が入れ替わっちゃうわけね。おもろい。

2009年7月1日 (水) 00:17時点における版

覚え書き

未分類の覚え書き。

tar で必要なファイルのみを抽出

以下のようなファイルがあるとして、hoge だけを抽出したければ

[hagio@localhost ~]$ tar tzf test.tar.gz 
dir1/
dir1/hoge
dir1/fuga
dir2/
dir2/fuga
[hagio@localhost ~]$ tar xzf test.tar.gz *hoge
[hagio@localhost ~]$ ls
dir1  test.tar.gz

locate 用データベースから除外

locate でファイルを検索する際、updatedb にて作成されたデータベースが用いられる。 テンポラリファイルや、バックアップファイルなどを検索する必要はないので、 これらを除外しておけば無駄がなくなると思われる。

# vi /etc/updatedb.conf
PRUNEFS = "auto afs iso9660 sfs udf"
★PRUNEPATHS = "/afs /media /net /sfs /tmp /udev /var/spool/cups /var/spool/squid /var/tmp"

ここに除外するディレクトリを追加すれば良い。

ビープ音がうるさい

# vi /etc/inputrc
set bell-style none

date コマンドについて

しょーもないけど覚え書き。ntp の実験なんかで時刻を書き換えたい場合、

# date --set "10 seconds ago"

といった書き方ができる。時刻を進めるには、ago の反対が必要… かと思っていろいろ調べていたが見つからない。

# date --set "10 seconds"

で 10 秒後に進められるじゃん orz

ちなみに、hwclock コマンドも同様のフォーマットが利用可能だ。

# hwclock --set --date "10 sec ago"

top について

top の man ページは読みづらいので、あまり読みたくない。

すべてのプロセスの top 情報を表示する

通常は画面に収まるだけのプロセスの情報しか表示されないが、すべてを出力することもできる。

# top -bn 1
-b
バッチモード。テキストに出力する場合はこれを使う。
-n number
出力する回数を指定する。

激速 top

# top -d 0.01
-d ss.tt
出力する間隔を指定する。マニュアルには、小数点以下は 1/10 秒と書いてあるが、1/100 秒までいけるようだ。よって、0.01 が最速で、Celeron 1.80 GHz だと 40 % 程度の CPU 時間を消費する。かるーく負荷をかけたいときなんかには、調節ができて便利。(ぇ

telnet-server について

telnet サーバの立ち上げかたと、ハマったところ。

  1. /etc/xinetd.d/telnet 中の disable = yesno にする
    • chkconfig telnet on でもよい
  2. /etc/init.d/xinetd restart で xinetd を再起動する (これがわからずハマった…)

以下のようなエラーが出て接続できない場合

Trying 192.168.1.1...
Connected to server.
Escape character is '^]'.
getaddrinfo: localhost Name or service not known
Connection closed by foreign host.

/etc/hosts に 192.168.1.1 server.hagio.org を追加するとよい。 ホスト名 "server" だけではダメで、FQDN にしたら接続できた。要するに、hostname コマンドの出力結果を貼付ける。 これも数時間ハマった。なぜこうしないといけないのかは不明なので、そのうち調査する。

BIOS のバージョンや HW 情報を得るには

# dmidecode

これもよく忘れる…。

パーティションテーブルの変更をカーネルに知らせるには

# partprobe

これ、よく忘れる上に Web で検索しにくいのだよ。でっかいクワガタを捕まえた気分 (謎)。

カーネル引き数を知るには

$ cat /proc/cmdline

ioctl() の使い方

  • 基本的には、fd = open() して ioctl(fd, request, ...) して close(fd) という流れ。
  • request は、man ioctl_list から探す。引き数の型も書いてあるので、これを参考にする。
  • サンプルコード:setro.c - RO (リードオンリー) フラグをセットする
#include <stdio.h>
#include <fcntl.h>
#include <linux/fs.h>

int main(int argc, char* argv[]) {
	int fd, res, flag;

	if (argc != 3) {
		printf("Usage: setro DEVICE RO_FLAG\n");
		return 1;
	}

	if ((fd = open(argv[1], O_RDWR)) < 0) {
		perror("open() failed");
		return 1;
	}

	flag = (int) *argv[2] - '0';
	if ((res = ioctl(fd, BLKROSET, &flag)) < 0) {
		perror("ioctl() failed");
		close(fd);
		return 1;
	}
	close(fd);
	return 0;
}

実行例:/dev/sda1 (/boot) をリードオンリーにする。

[root@centos52 ~]# umount /boot ★いったんアンマウント
[root@centos52 ~]# ./setro /dev/sda1 1 ★リードオンリーにセット
[root@centos52 ~]# mount /boot
mount: ブロックデバイス /dev/sda1 は書き込み禁止です、読込み専用でマウントします
[root@centos52 ~]# umount /boot
[root@centos52 ~]# ./setro /dev/sda1 0 ★リードオンリーを解除
[root@centos52 ~]# mount /boot

/etc/sysconfig/i18n について

  • 読み込まれる場所
    • /etc/rc.d/rc.sysinit (rhgb 利用時のみ?)
    • /etc/init.d/functions/etc/profile.d/lang.sh
    • /etc/init.d/firstboot
  • SUPPORTEDsystem-config-language (GUI アプリ) が使う

その他

リダイレクトの謎

リダイレクトの動きを確認するために、標準出力と標準エラーに文字列を吐くプログラムを書いた。

[hagio@lab ~]$ cat > stdout.c
#include <stdio.h>
int main(void) {
    fprintf(stdout, "stdout\n");
    fprintf(stderr, "stderr\n");
    return 0;
}

これを普通に実行すると、もちろん stdout が先に出力される。

[hagio@lab ~]$ cc -o stdout stdout.c && ./stdout
stdout
stderr

しかし、標準出力と標準エラーを同じファイルにリダイレクトすると…

[hagio@lab ~]$ ./stdout > test 2>&1
[hagio@lab ~]$ cat test 
stderr
stdout

なぜ逆転する?? とりあえず、ltrace を取ってみる。

[hagio@lab ~]$ ltrace -tt -o ltrace.log ./stdout > tmp 2>&1
[hagio@lab ~]$ cat tmp
stderr
stdout
[hagio@lab ~]$ cat ltrace.log 
20:03:34.192236 __libc_start_main(0x80483d4, 1, 0xbf80f644, 0x8048450, 0x8048440 <unfinished ...>
20:03:34.192460 fwrite("stdout\n", 1, 7, 0x5de4c0) = 7
20:03:34.193010 fwrite("stderr\n", 1, 7, 0x5de560) = 7
20:03:34.193327 +++ exited (status 0) +++

ちゃんと "stdout" を書き出す方が先に呼び出されている。しかし、strace を取ってみると…

[hagio@lab ~]$ strace -tt -o strace.log ./stdout > tmp 2>&1
[hagio@lab ~]$ tail -n 4 strace.log
20:05:49.658550 mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7f62000
20:05:49.658611 write(2, "stderr\n", 7) = 7
20:05:49.658907 write(1, "stdout\n", 7) = 7
20:05:49.658993 exit_group(0)           = ?

うむむむむ、これは何か「エラーは早く表示すべき」みたいなバイアスがかかってるのか…。 glibc が怪しいので、ソースでも見てみるか。

2009/06/30 少し追ってみたが、glibc 全然読めん…。ただ、気になったのはここ

"libio/stdfiles.c"
DEF_STDFILE(_IO_2_1_stdin_, 0, 0, _IO_NO_WRITES);
DEF_STDFILE(_IO_2_1_stdout_, 1, &_IO_2_1_stdin_, _IO_NO_READS);
DEF_STDFILE(_IO_2_1_stderr_, 2, &_IO_2_1_stdout_, _IO_NO_READS+_IO_UNBUFFERED);★

_IO_UNBUFFERED というフラグが立っているようだ。 なるほど、通常 fwrite() で使われるバッファを経由しないから、順番が入れ替わっちゃうわけね。おもろい。