So-net無料ブログ作成
検索選択
前の10件 | -

bashでの配列の使用 [Linux]

Perl スクリプトをシェルスクリプト(bash on Linux) に移植する必要があり、対応を行った。
この過程で、スクリプトの可読性を良くするために配列(連想配列を含む)を使用した。

以下は、備忘録として、配列の使用に関して要点をまとめたものである。

1. 配列 (indexed array)


(1) 変数の宣言


通常の変数の場合と同じである。
・通常は変数の宣言は不要である。
・local により、関数内のローカル変数として宣言することが可能である。


(2) 値の設定


(a) 要素毎の設定

a_demo[0]=a
a_demo[1]=b


(b) 全要素の設定

a_demo=(a b)


(補足)
・空の配列の作成: a_demo=()
・配列の宣言と要素の設定を同時にすることが可能である。
 local a_demo=(a b)


(c) 配列要素の追加

a_demo+=(c)


(3) 値の参照

${#a_demo[*]} ... 要素数
${a_demo[*]} ... 全要素
${a_demo[n]} ... n 個目の要素


(補足)
* の代わりに @ を使用することも可能である。
両者の違いは、通常の変数参照時の "$*" と "$@" の違いと同様である。


2. 連想配列 (associative array、hash)


bash v4 で追加された機能である。
未対応のバージョンでは、エラーとなる。

(1) 変数の宣言


使用する前に、連想配列としての変数の宣言が必要である。

declare -A h_demo


(補足)
関数内で上記の変数宣言を行った場合には、当該関数内でのみ有効となる。
(関数内でのローカル変数となる。)


(2) 値の設定


(a) 要素毎の設定

h_demo[Jan]=1
h_demo[Feb]=2


(b) 全要素の設定

h_demo=([Jan]=1 [Feb]=2)


(補足)
・空の連想配列の作成: h_demo=()
・連想配列の宣言と要素の設定を同時にすることが可能である。
 declare -A h_demo=([Jan]=1 [Feb]=2)


(3) 値の参照

${#h_demo[*]} ... 要素数
${!h_demo[*]} ... 全要素(key)
${h_demo[*]} ... 全要素(value)
${h_demo[key]} ... 特定の要素(key に対応する value)


(補足)
* の代わりに @ を使用することも可能である。
両者の違いは、通常の変数参照時の "$*" と "$@" の違いと同様である。



xawtvのウィンドウサイズを変更すると画像が表示されなくなる [Debian]

[ソフトウェアのバージョン]
xawtv 3.103-3+b1
linux-image-3.16.0-4-686-pae 3.16.39-1+deb8u2

1. 発生事象


Debian 8 において、xawtv のウィンドウサイズを変更すると画像が表示されなくなる。

・xawtv を再起動すると回復する。
・Debian 7 (linux-image-3.2.0-4-686-pae 3.2.86-1)では発生しない。
・xawtv 3.102-3 (Debian 7 のパッケージ)に変更しても状況は変わらない。


2. 原因


kernel 3.16.x 上で発生する xawtv のバグである。
(詳細は、備考を参照。)


3. 対処方法


下記の手順を実施する。

(1) 更新するパッケージの入手


ubuntu 16.10 の下記のパッケージをダウンロードする。

fontconfig-config_2.11.94-0ubuntu2_all.deb
libfontconfig1_2.11.94-0ubuntu2_i386.deb
pia_3.103-4_i386.deb
scantv_3.103-4_i386.deb
xawtv-plugins_3.103-4_i386.deb
xawtv_3.103-4_i386.deb


(補足)
・Debian 8 用の更新パッケージはリリースされていない。
・Debian sid よりも ubuntu 16.10 の方が更新するパッケージの数が少ない。
https://pkgs.org/ 等から当該パッケージをダウンロードする。


(2) パッケージの更新

# dpkg -i *.deb


(補足)
更新内容は、下記の通りである。

・fontconfig-config
 2.11.0-6.3+deb8u1 => 2.11.94-0ubuntu2
・libfontconfig1
 2.11.0-6.3+deb8u1 => 2.11.94-0ubuntu2
・pia
 3.103-3+b1 => 3.103-4
・scantv
 3.103-3+b1 => 3.103-4
・xawtv-plugins
 3.103-3+b1 => 3.103-4
・xawtv
 3.103-3+b1 => 3.103-4

[備考]


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



CentOS 7でgpmが機能しない [CentOS]

1. 発生事象


CentOS 7 で gpm が機能しない。

[ソフトウェアのバージョン]
gpm-libs-1.20.7-5.el7.x86_64
gpm-1.20.7-5.el7.x86_64
kernel-3.10.0-514.10.2.el7.x86_64

(補足)
・当該サービスの起動は正常にできている。
・当該サービスを再起動しても状況は変わらない。
・稀に機能することがある。


2. 対処方法


カーネルを下記のバージョンに変更すると機能するようになる。
・kernel-3.10.0-229.20.1.el7.x86_64



uimの入力ウィンドウのフォント指定 [Linux]

1. 発生事象


uim の入力ウィンドウで想定外のフォントが使用されることがある。
・変換候補、変換確定後のフォントについては想定通りである。
・使用するアプリケーションによっては、上記事象が発生しない場合もある。


2. 対処方法


下記の手順を実施する

(1) 下記の内容で ~/.uim を作成する。

(define uim-xim-use-xft-font? #t)
(define uim-xim-xft-font-name "<font name>")  … フォントの指定


(例) さざなみゴシックの場合
(define uim-xim-xft-font-name "Sazanami Gothic")

(補足)
初期値: ~/.uim.d/customs/custom-xim.scm を参照


(2) X を再起動する。


多分、uim-xim のみの再起動でも反映されると思われる。



CentOS 7のMD+LVM化で/が認識されない [CentOS]

CentOS 7.3 において、標準パーティション環境から MD+LVM 環境への移行を行った。
実施した手順は、下記の通りである。

・mdadm での MD デバイスの作成
・MD デバイス上での LVM の作成(ただし、/boot 用のデバイスを除く)
・PV/VG/LV/FS の作成(ただし、/boot 用デバイスでは FS のみ作成)
・当該ファイルのコピー
・/etc/mdadm.conf の更新、initrd ファイルの更新

その際、ブート時に / (root) パーティションが認識されない状況になってしまった。
以下は、備忘録として発生事象と対処方法をまとめたものである。

1. 発生事象


MD+LVM 環境で、ブート時に / 用の LV が認識されない。

[出力されるメッセージ]
dracut-initqueue[pid]: Warning: dracut-initqueue timeout \
- starting timeout scripts

(補足)
・MD なしの LVM 環境では、問題は発生しない。
・下記の状態から進まない。
 Started dracut pre-mount hook.
 A start job is running for .service


2. 対処方法


下記のカーネル・オプション(kernel 行に設定するオプション)を追加する。

・rd.auto rd.auto=1


3. 参考資料


(1) dracut のマニュアル - DRACUT.CMDLINE(7)


rd.auto rd.auto=1
 enable autoassembly of special devices like cryptoLUKS, dmraid,
 mdraid or lvm. Default is off as of dracut version >= 024.

 cf. http://man7.org/linux/man-pages/man7/dracut.cmdline.7.html



CentOS 6.9へのアップデート [CentOS]

CentOS 6.8 から 6.9 へのアップデートを行った。
インストールするパッケージに依存するが、今回のアップデートは以下のような結果であった。

1. アップデートによるパッケージ数の増減はない。

2. 新たな不具合の発生はない。

3. rsh、telnet でログインした時のログイン処理の不具合が改善されている。


[該当する不具合]
http://dan-project.blog.so-net.ne.jp/2016-07-02

該当するパッケージは、下記の通り。
・libblkid-2.17.2-12.28.el6.i686
・libuuid-2.17.2-12.28.el6.i686
・util-linux-ng-2.17.2-12.28.el6.i686



chronyでのNTPサーバーの構築 [CentOS]

CentOS 7.3 上で NTP サーバーの構築を行った。
ntpd を使用することも可能であるが、今回は chrony を使用した。
最低限必要な手順は、以下の通りである。

1. ファイアウォールの設定確認


下記の通信が許可されていることを確認する。

・上位 NTP サーバーの 123/udp ポートへのアクセス
・NTP クライアントからの 123/udp ポートへのアクセス


2. /etc/chrony.conf の編集


(1) 上位 NTP サーバーの指定

server <ntp-server-1> iburst
...


iburst: 起動時に短い間隔で問い合わせ、初回の同期に要する時間を短縮する。


(2) 時刻同期を許可する NTP クライアントの指定

(例)
allow 192.168.0.0/24


デフォルト値: 全ノード拒否


3. chronyd の再起動
# systemctl restart chronyd

4. 備考


(1) 時刻同期の状況確認

# chronyc [-n] sources


・-n: 逆引きの名前解決を行わない(IP アドレスで表示する)。
・実行結果の S 欄が * の NTP サーバーと時刻同期を行っている。


(2) 上位 NTP サーバーと時刻同期できない場合の発生事象


NTP クライアントが NTP サーバーと時刻同期できない(ntpd の場合と同様)。
よって、通常は 上位 NTP サーバーを複数指定する。


[追記]


前の10件 | -