So-net無料ブログ作成

evalでのコマンド実行時のPIPESTATUSの参照(bash) [Linux]

1. eval でのコマンド実行時の PIPESTATUS の参照(bash)


bash では、PIPESTATUS を参照することにより、パイプラインの途中のコマンドの終了ステータスを取得できる。

% bash -c 'true|false|(exit 2); echo ${PIPESTATUS[@]}'
0 1 2


ほとんどの場合、@ を * に置き換えても同様の結果が得られる($@ と $* の違いと同様)。
しかし、eval でのコマンド実行時には、上記の方法では PIPESTATUS を参照できない。

cmd="command1 | command2 | command3"
eval $cmd
echo ${PIPESTATUS[@]}


このような場合には、下記のようにすることで参照可能である。

cmd="command1 | command2 | command3"
eval "$cmd; STATUS=(\${PIPESTATUS[@]})"
echo ${STATUS[@]}

2. サンプルコードと実行例
% expand -4 demo.sh
#!/bin/bash

exec_cmd() {
    local cmd="$1" test=${2:-0}
    local status=0

    if [ $test = 1 ]; then
        echo $cmd
    else
        eval "$cmd; STATUS=(\${PIPESTATUS[@]})"

        echo "value of \${#STATUS[@]}: ${#STATUS[@]}"
        echo "value of \${STATUS[@]}: ${STATUS[@]}"
        status=${STATUS[0]}
    fi
    echo "status of 1st command: $status"

    return $status
}

log=`basename $0 .sh`.log
exec_cmd "$1 2>&1 | tee $log"

exit $?
% ./demo.sh echo\ aaa
aaa
value of ${#STATUS[@]}: 2
value of ${STATUS[@]}: 0 0
status of 1st command: 0
% echo $?
0
% ./demo.sh aaa
./demo.sh: line 10: aaa: command not found
value of ${#STATUS[@]}: 2
value of ${STATUS[@]}: 127 0
status of 1st command: 127
% echo $?
127

3. 参考情報


cf. https://stackoverflow.com/questions/21878286/how-to-access-the-bash-pipestatus-array-of-an-evald-command



存在しないホスト名が127.0.0.1に名前解決される [CentOS]

1. 発生事象


CentOS 6.9 において、存在しないホスト名が 127.0.0.1 に名前解決される。

% ping aaa
PING aaa.private.net (127.0.0.1) 56(84) bytes of data.
64 bytes from localhost.localdomain (127.0.0.1): \
icmp_seq=1 ttl=64 time=0.034 ms
…


(補足)
・名前解決は、/etc/hosts、DNS の順に参照する。
 (/etc/nsswitch.conf の設定)
・/etc/hosts に当該ホスト名は存在しない。
・DNS では当該ホスト名が名前解決されない(host aaa の実行)。
・/etc/resolv.conf には、ISP のネームサーバーの設定のみを行っている。
 (domain/search の設定は行っていない。)
・ローカル・ドメインには、ダミーのドメイン名を付いている。
 (private.net: 192.168.0.0)
・CentOS 7.3 でも同様である。
・Debian 7/8 では発生しない。


2. 対処方法


/etc/resolv.conf において、domain または search で ISP のドメイン名を設定する。

% ping aaa
ping: unknown host aaa


リストア後のsystemd-journaldのエラー [CentOS]

CentOS 7.3 において、システムのリストア後に systemd-journald のエラーが発生するようになってしまった。
発生事象と対処方法は、以下の通りである。

1. 発生事象


システムのリストア後に systemd-journald のエラーが発生する。

systemd-journald[807]: Failed to write entry (9 items, 267 bytes), \
ignoring: Bad address

2. 対処方法


下記の手順を実施する。

(1) ファイルの特定

# journalctl --verify


(2) 当該ファイルの削除


FAIL: と表示されるファイル(*.journal) を削除する。


(3) systemd-journald の再起動

# systemctl restart systemd-journald

3. 備考


systemd-journald のバグとのこと。

cf.
https://bugzilla.redhat.com/show_bug.cgi?id=1069828
https://access.redhat.com/discussions/2100681