ip コマンドで ifconfig/ifdown/ifup 相当のことをするための覚書

概要

ip コマンドの使い方を毎回忘れるので覚書

ifconfig

$ ifconfig
enp0s3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.0.103  netmask 255.255.255.0  broadcast 192.168.0.255
        inet6 fe80::8993:6c4d:1cb:6e8d  prefixlen 64  scopeid 0x20<link>
        ether 08:00:27:dc:d8:e3  txqueuelen 1000  (Ethernet)
        RX packets 1696  bytes 210497 (205.5 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 822  bytes 90988 (88.8 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 32  bytes 2592 (2.5 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 32  bytes 2592 (2.5 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
...

$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:dc:d8:e3 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.103/24 brd 192.168.0.255 scope global noprefixroute dynamic enp0s3
       valid_lft 162574sec preferred_lft 162574sec
    inet6 fe80::8993:6c4d:1cb:6e8d/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
...

ifconfig で特定のデバイスの情報を表示する場合

$ ifconfig enp0s3
enp0s3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.0.103  netmask 255.255.255.0  broadcast 192.168.0.255
        inet6 fe80::8993:6c4d:1cb:6e8d  prefixlen 64  scopeid 0x20<link>
        ether 08:00:27:dc:d8:e3  txqueuelen 1000  (Ethernet)
        RX packets 1825  bytes 221661 (216.4 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 887  bytes 103090 (100.6 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

$ ip addr show enp0s3
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:dc:d8:e3 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.103/24 brd 192.168.0.255 scope global noprefixroute dynamic enp0s3
       valid_lft 162454sec preferred_lft 162454sec
    inet6 fe80::8993:6c4d:1cb:6e8d/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

ifdown

$ sudo ifdown  enp0s3

$ sudo ip link set enp0s3 down

ifup

$ sudo ifup enp0s3

$ sudo ip link set enp0s3 up

[おまけ] NIC の状態を確認する

$ ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
    link/ether 08:00:27:dc:d8:e3 brd ff:ff:ff:ff:ff:ff
...

Fedora 22 の dnf のメモ

概要

Fedora 22 からパッケージ管理システムが yum から dnf に変わる.

Workstation を見る限りでは yum も残っている.
# シンボリックリンクで dnf というわけではなさそう

dnf の使い方

// お約束の実行
# dnf update
# dnf upgrade

// Development Tools の入れ方も同じ
# dnf groupinstall "Development Tools"

基本的な使い方が大きく変っていない (?) ようでよかった

Makefile のメモ書き

概要

Makefile のメモ書き

subst でオブジェクトファイル名を生成する代わり

source = hoge.cpp fuga.cpp piyo.cpp

# 今まで subst でこう書いてた
objects = $(subst .cpp,.o,${source})

# これでもいい
objects = $(source:.cpp=.o) 

シェルスクリプトにおいてバックエンドで実行したコマンドの同期を取る方法

概要

シェルスクリプトでは wait コマンドにプロセス ID を指定することで同期がとれる

wait コマンドのサンプル

sleep コマンドをバックグラウンドで実行させ,wait コマンドで同期をとる
バックグランドで実行したコマンドのプロセス ID は $! で取得できる

#!/bin/bash

for ((i=0; i<3; i++))
do
  sleep 5 &
  array[i]=$!
  echo "Sleeping: ${i} : ${array[i]}"
done

wait ${array[@]}

echo "Finish!!"

シェルスクリプトで同期を取るサンプルコード

シェルスクリプト内で別のシェルスクリプトをバックグラウンドで実行し,終了の同期をとる
また,プロセス ID は重複しないはずなので配列の添字にも使える.

run.sh
#!/bin/bash                                                                     

./myshell1.sh &
array[$!]=$!
./myshell2.sh &
array[$!]=$!
./myshell3.sh &
array[$!]=$!

wait ${array[@]}

echo "Finish"
myshell{1, 2, 3}.sh
#!/bin/bash                                                                     

echo "$0: Sleeping..."
sleep 5
実行方法と結果
$ ./run.sh 
./myshell1.sh: Sleeping...
./myshell2.sh: Sleeping...
./myshell3.sh: Sleeping...
Finish

[余談] 別のファイルにしないでバックグラウンドで実行する場合

グループ化してバックグラウンドで実行すれば良い

#!/bin/bash                                                                     

{
    echo "Sleeping1..."
    sleep 5
} &
array[$!]=$!

{
    echo "Sleeping2..."
    sleep 5
} &
array[$!]=$!

{
    echo "Sleeping3..."
    sleep 5
} &
array[$!]=$!

wait ${array[@]}

echo "Finish"

LD_LIBRARY_PATH の設定方法をあれこれ考える

概要

シェルスクリプト内で LD_LIBRARY_PATH を設定することを考える.
LD_LIBRARY_PATH が設定されていない状態で,以下の方法で設定すると末尾に ":" がつくため気持ち悪い
// もちろん動作には影響を与えないので,問題はないはずだが...

#!/bin/bash

# LD_LIBRARY_PATH は空とする
export LD_LIBRARY_PATH=/usr/local/lib64:${LD_LIBRARY_PATH}
echo ${LD_LIBRARY_PATH}  # /usr/local/lib64: が表示されるはずだが,末尾の : が気になる

:${パラメータ:+<値>} を使う

パラメータが空文字以外に設定されている場合,パラメータに値を代入する

#!/bin/bash

LD_LIBRARY_PATH=/usr/local/lib64${LD_LIBRARY_PATH:+;}${LD_LIBRARY_PATH}
export LD_LIBRARY_PATH

if でがんばる

if [ -z 文字列 ]; は文字列が空文字の場合に真になる

#!/bin/bash                                                                     

if [ -z ${LD_LIBRARY_PATH} ]; then
    export LD_LIBRARY_PATH=/usr/local/lib64
else
    export LD_LIBRARY_PATH=/usr/local/lib64:${LD_LIBRARY_PATH}
fi

[余談] : ${パラメータ:=<値>} を使う

パラメータが空の場合もしくは設定されていない場合に,パラメータに値を代入する
ただし,この方法ではパラメータに追加ができないので,LD_LIBRARY_PATH の設定には不向きである

#!/bin/bash                                                                     

: ${LD_LIBRARY_PATH:="/usr/local/lib64"}
export LD_LIBRARY_PATH

${パラメータ:-<値>} が上記と同じ動作となる

#!/bin/bash                                                                     

LD_LIBRARY_PATH=${LD_LIBRARY_PATH:-/usr/local/lib64}
export LD_LIBRARY_PATH

PIPESTATUS でパイプラインの各コマンドの終了ステータスを取得する

概要

$PIPESTATUS を使うことでパイプラインの各コマンドの終了ステータスを取得できる.
ただし,使用できる環境には制限がある模様.

$? で終了ステータスを取得する場合の問題点

$? で終了ステータスを取得した場合は一番右のコマンドの終了ステータスを取得する.

$ ./configure 2>&1 | tee _configure.log
$ echo $? # tee の終了ステータスが表示される

$PIPESTATUS を使う場合

上記のサンプルで ./configure の終了ステータスをみたい場合は $PIPESTATUS を使う.

$ ./configure 2>&1 | tee _configure.log
$ echo ${PIPESTATUS[0]} # configure の終了ステータスが表示される


また,全コマンドの終了ステータスをまとめて取得したい場合は以下のようにする.

$ echo ${PIPESTATUS[@]}

$PIPESTATUS を使ったサンプルコード

#!/bin/bash

./configure 2>&1 | tee _configure.log
if [ ${PIPESTATUS[0]} = 0 ]; then
    echo "configure: success"
else
    echo "configure: failed"
    exit 1
fi

make 2>&1 | tee _make.log
if [ ${PIPESTATUS[0]} = 0 ]; then
    echo "make: success"
else
    echo "make: failed"
    exit 2
fi

make check 2>&1 | tee _make_check.log
if [ ${PIPESTATUS[0]} = 0 ]; then
    echo "make check: success"
else
    echo "make check: failed"
    exit 3
fi

make install 2>&1 | tee _make_install.log
if [ ${PIPESTATUS[0]} = 0 ]; then
    echo "make install: success"
else
    echo "make install: failed"
    exit 4
fi

[余談] がんばるのがダルイ ログだけが欲しい場合

グループ化してまとめてログを出すだけでもいいかもしれない

{
./configure
make
make check
make install
} 2>&1 | tee _build.log