goo blog サービス終了のお知らせ 

dak ブログ

python、rubyなどのプログラミング、MySQL、サーバーの設定などの備忘録。レゴの写真も。

awk で tsv の特定カラムが正規表現でマッチする行を抽出する方法

2020-07-23 14:41:57 | linux
awk で tsv の特定カラムが正規表現でマッチする行を抽出する方法のメモ。

tsv の第3カラムが正規表現にマッチする行を抽出する場合、以下のようにします。
$ cat text.tsv
1       a       1a
1       b       1b
1       c       1c
2       a       2a
2       b       2b
2       c       2c

$ cat text.tsv | awk -F "\t" '$3 ~ /a/ {OFS="\t"; print}'
1       a       1a
2       a       2a



grep の出力結果をバッファリングしない方法

2020-02-05 22:42:41 | linux
grep の出力結果をバッファリングしない方法のメモ。
grep --line-buffered

で、grep の結果がバッファリングされなくなります。

tail -f でシステムのログなどをリアルタイムに確認する際、特定の文字列に該当する行を
grep で単純にフィルタリングすると、条件に合致してもバッファリングされて
しばらく出力されない場合があります。

しかし、--line-buffered によって、バッファリングされずに行単位で出力されるようになります。

curl で BASIC 認証のID・パスワードを指定する方法

2019-12-21 15:26:52 | linux
curl で BASIC 認証のID・パスワードを指定する方法。
curl --basic -u {id}:{パスワード} URL


digest 認証の場合には、--digest を指定します。
curl --digest -u {id}:{パスワード} URL


その他のオプション。
-s:         プログレスメーター、エラーメッセージを非表示。
-v:         デバッグ情報を表示
-o:         出力先のファイルを指定
--insecure: SSL証明を無視


grepでマッチした前後の行を表示する方法

2019-11-02 22:01:48 | linux
grepでマッチした前後の行を表示する方法のメモ

-A {行数} を指定すると、パターンにマッチした行から指定行数分の行も出力します。
"A" は after の A です。

-B {行数} を指定すると、パターンにマッチした行より前の指定行数分の行も出力します。
"B" は before の B です。

$ wget -O - 'https://news.goo.ne.jp/' | grep -A 1 -B 1 スタート
<li><a href="https://www.goo.ne.jp/sitemap/">サイトマップ</a></li>
<li><a href="https://www.goo.ne.jp/set/">スタートページに設定</a></li>
<li><a href="https://www.goo.ne.jp/rss/">RSS</a></li>


boost のインストールメモ

2019-04-13 22:53:45 | linux
boost をインストールした際のメモ。

■事前準備
python の include ディレクトリにリンクを貼っておく
cd ~/.pyenv/versions/3.6.5/include
ln -s python3.6m python3.6


■インストール
gtar zxvf boost_1_70_0.tar.gz
cd boost_1_70_0
./bootstrap.sh --with-python-root=~/.pyenv/versions/3.6.5
./b2
./b2 install --prefix=~/local/boost



cmake でインストール先を指定する方法

2019-04-13 20:32:18 | linux
cmake でインストール先を指定する方法のメモ。

インストールしたいモジュールを展開したディレクトリで以下を実行。
mkdir build
cd build
cmake .. -DCMAKE_INSTALL_PREFIX=インストール先のディレクトリ
make install


インストール先のディレクトリとして /home/xxx/localを指定すると、
/home/xxx/local/{bin,lib,include}などにインストールされます。


apache のモジュールを確認する方法

2019-02-23 16:01:45 | linux
apache のモジュールを確認する方法のメモ。

■静的モジュール
httpd -l
$ httpd -l
Compiled in modules:
  core.c
  prefork.c
  http_core.c
  mod_so.c


■読込済みの静的・動的モジュール
httpd -M
$ httpd -M
Syntax OK
Loaded Modules:
 core_module (static)
 mpm_prefork_module (static)
 http_module (static)
 so_module (static)
 auth_basic_module (shared)
 auth_digest_module (shared)
 authn_file_module (shared)
 authn_alias_module (shared)
 


プロセスが利用しているポートを調べる方法

2019-02-11 12:38:26 | linux
プロセスが利用しているポートを調べる方法のメモ
$ sudo netstat -anp
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name
tcp        0      0 127.0.0.1:41207             0.0.0.0:*                   LISTEN      32524/Passenger Rub
tcp        0      0 0.0.0.0:25                  0.0.0.0:*                   LISTEN      4479/smtpd
...


-a: 接続待ち状態/接続待ちではないソケットも表示
-n: ホスト・ポート・ユーザーなどを数字で表示
-p: PID/Program name を表示(rootで実行する必要がある)

rsync の timeout エラーについて調査した結果のメモ

2018-11-17 20:16:29 | linux
現在運用中のシステムでは rsync で数十台のサーバのログを、
ログ集計サーバに転送するようにしていますが、
送信側でエラーになっていて、転送に失敗することが多いため、
rsync のソース(rsync-3.1.3)を調べてみました。

結果的には、/etc/rsyncd.conf に "listen backlog = 転送元サーバ台数" を
設定すればよさそう。
ちなみに、listen backlog はデフォルトでは 5 になっています。

■loadparm.c

 /* ==== global_vars ==== */
 {
 ...
 /* listen_backlog; */          5,
 ...
 },

以下、クライアントからの要求をどのように処理しているかを、ソースを追って見てみます。
■clientserver.c

int daemon_main(void)
{
        ...

        start_accept_loop(rsync_port, start_daemon);
        return -1;
}

start_accept_loop() で accept しているので、次に start_accept_loop() を見てみます。
■socket.c

void start_accept_loop(int port, int (*fn)(int, int))
{
        ...

        /* open an incoming socket */
        sp = open_socket_in(SOCK_STREAM, port, bind_address, default_af_hint);
        if (sp == NULL)
                exit_cleanup(RERR_SOCKETIO);

        /* ready to listen */
        FD_ZERO(&deffds);
        for (i = 0, maxfd = -1; sp[i] >= 0; i++) {
★1             if (listen(sp[i], lp_listen_backlog()) < 0) {

        ...

        while (1) {
                ...

                if (select(maxfd + 1, &fds, NULL, NULL, NULL) < 1)
                        continue;

                for (i = 0, fd = -1; sp[i] >= 0; i++) {
                        if (FD_ISSET(sp[i], &fds)) {
                                fd = accept(sp[i], (struct sockaddr *)&addr,
                                            &addrlen);
                                break;
                        }
                }

                ...

★2             if ((pid = fork()) == 0) {
                        int ret;
                        for (i = 0; sp[i] >= 0; i++)
                                close(sp[i]);
                        /* Re-open log file in child before possibly giving
                         * up privileges (see logfile_close() above). */
                        logfile_reopen();
★3                     ret = fn(fd, fd);
                        close_all();
                        _exit(ret);
                } else if (pid < 0) {
                        rsyserr(FERROR, errno,
                                "could not create child server process");
                        close(fd);
                        /* This might have happened because we're
                         * overloaded.  Sleep briefly before trying to
                         * accept again. */
                        sleep(2);
                } else {
                        /* Parent doesn't need this fd anymore. */
                        close(fd);
                }
        ...
}

★1 で listen() していて、キューの最大長は第2引数の lp_listen_backlog() が指定されます。。
これがデフォルトでは 5 になっています(loadparm.c)。

★2 accept 後に fork しています。
select() で全クライアントとの読み書き処理を行っていたら...と思っていましたが、
fork() していたので、ひと安心。

★3 fn は start_accept_daemon() の第2引数の start_daemon()。
転送処理は start_daemon() で行っているはず。(ここで調査終了)


top コマンドのメモリ表示の単位を変える方法

2018-10-31 01:03:03 | linux
top コマンドのメモリ表示の単位を変える方法のメモ。

top コマンドはデフォルトではメモリ表示の単位が KiB になています。
top - 01:05:07 up 154 days, 13:41, 20 users,  load average: 1.13, 0.91, 0.52
Tasks: 347 total,   2 running, 338 sleeping,   6 stopped,   1 zombie
%Cpu(s): 12.4 us,  0.5 sy,  0.0 ni, 87.1 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem : 30716156 total,  2187040 free, 18415088 used, 10114028 buff/cache
KiB Swap:        0 total,        0 free,        0 used. 10164000 avail Mem

E (Shift+e) で、K -> M -> G -> ... とメモリ表示の単位が変更できます。

topでスレッドを表示する方法

2018-09-15 19:23:53 | linux
topでスレッドを表示する方法のメモ。

topを実行中に H を押すと、実行中のスレッドが表示されます。

また、topを実行中に 1 を押すと、CPU 毎の情報が表示されますので、
特定のCPUの使用率が高い場合には、「topでプロセスを実行しているCPUを見る方法」も
あわせて実行すると、どのスレッドが CPU をよく使っているかがわかります。

topでプロセスを実行しているCPUをみる方法

2018-09-15 19:14:23 | linux
top コマンドでプロセスを実行している CPU をみる方法のメモ。

top コマンドを実行中に f を押すと、表示項目の選択肢が表示されます。
Current Fields:  AEHIOQTWKNMbcdfgjplrsuvyzX  for window 1:Def
Toggle fields via field letter, type any other key to return

* A: PID        = Process Id
* E: USER       = User Name
* H: PR         = Priority
* I: NI         = Nice value
* O: VIRT       = Virtual Image (kb)
* Q: RES        = Resident size (kb)
* T: SHR        = Shared Mem size (kb)
* W: S          = Process Status
* K: %CPU       = CPU usage
* N: %MEM       = Memory usage (RES)
* M: TIME+      = CPU Time, hundredths
  b: PPID       = Parent Process Pid
  c: RUSER      = Real user name
  d: UID        = User Id
  f: GROUP      = Group Name
  g: TTY        = Controlling Tty
  j: P          = Last used cpu (SMP)
  p: SWAP       = Swapped size (kb)
  l: TIME       = CPU Time
  r: CODE       = Code size (kb)
  s: DATA       = Data+Stack size (kb)
  u: nFLT       = Page Fault count
  v: nDRT       = Dirty Pages count
  y: WCHAN      = Sleeping in Function
  z: Flags      = Task Flags 
* X: COMMAND    = Command name/line


"Last used cpu" を表示したいので、j を押して、リターンキーを押すと元の画面に戻ります。
先頭から順に表示されるので、TIME+ と COMMAND の間に表示される P が CPU の id です。
top - 19:20:32 up 340 days,  4:25,  3 users,  load average: 1.03, 1.21, 1.32
Tasks: 221 total,   2 running, 219 sleeping,   0 stopped,   0 zombie
Cpu(s):  4.0%us,  2.1%sy,  0.0%ni, 85.7%id,  8.1%wa,  0.0%hi,  0.1%si,  0.0%st
Mem:  37017500k total, 36737920k used,   279580k free,   140708k buffers
Swap:  1048572k total,   388416k used,   660156k free, 18871820k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  P COMMAND



putty でポートフォワードして踏み台の先のWebサーバにアクセスする方法

2018-07-16 18:31:48 | linux
putty でポートフォワードする場合のメモ。

踏み台サーバで経由した先の非公開の Webサーバに、putty でポートフォワードして
アクセスする場合。

接続元: Windows端末
踏み台サーバ名: ssh
Webサーバ名:   web

[1] putty で踏み台サーバ(ssh)の接続情報を読み込み。
[2] 左メニューの[接続-SSH-トンネル]を選択。
[3] 源ポート: Windows 端末で指定するポート番号(以下の場合、10080)
  接続先:踏み台経由で接続したい "Webサーバ:ポート番号"(web:80) を指定。
[4] 「開く」ボタンを押下。
[5] ユーザID、パスワードを入力して踏み台サーバ(ssh)にログイン。
[6] ブラウザで http://127.0.0.1:10080/~ にアクセス。

wgetでリクエストヘッダを指定する方法

2018-07-16 18:07:16 | linux
wgetでリクエストヘッダを指定したい場合には、--header オプションで指定します。
wget --header='Host: def.com' --header='Referer: def.com' 'http://abc.com/index.html'

Referer は --referer='...' でも指定できますが。


実際に送信されるリクエストヘッダは --debug でデバッグ情報を出力することで
確認できます。
$ wget --debug 'http://abc.com/'

DEBUG output created by Wget 1.12 on linux-gnu.

--2018-07-16 18:24:20--  http://abc.com/
172.20.253.21:8080 に接続しています... 接続しました。
Created socket 3.
Releasing 0x0000000001c7aeb0 (new refcount 0).
Deleting unused 0x0000000001c7aeb0.

---request begin---
GET http://abc.com/ HTTP/1.0
User-Agent: Wget/1.12 (linux-gnu)
Accept: */*
Host: abc.com

---request end---
...



--header='Host: def.com' を付与すると、リクエストヘッダの Host: abc.com が
上書きされて Host: def.com になっているのがわかります。
$ wget --debug --header='Host: def.com' 'http://abc.com/'

Setting --header (header) to Host: abc.com
DEBUG output created by Wget 1.12 on linux-gnu.

--2018-07-16 18:20:40--  http://abc.com/
172.20.253.21:8080 に接続しています... 接続しました。
Created socket 3.
Releasing 0x00000000018e2eb0 (new refcount 0).
Deleting unused 0x00000000018e2eb0.

---request begin---
GET http://abc.com/ HTTP/1.0
User-Agent: Wget/1.12 (linux-gnu)
Accept: */*
Host: def.com

---request end---
...