標準エラー出力をパイプラインで次に渡す

表題を一部知らなかったのでメモ。

■ 環境

  • Linux
  • Mac OSX El Capitan

■ パイプライン

標準エラー出力をパイプラインで後続のコマンドの標準入力に渡すときはいつも下記のように実行していた。

$ command1 2>&1 | command2

上記のように実行すれば、標準出力と標準エラー出力がともにパイプラインで後続のコマンドに引き渡される。これを下記のようにも書けるようだ。

$ command1 |& command2

|&“は”2>&1 |“の短縮表記だそうである。是非覚えておこう。

以上。

logrotate: ALERT exited abnormally with [1]

表題のメッセージが”/var/log/messages“に出力されていた。

■ 環境

  • CentOS 6.9

■ logrotate

最近変更はしたが、変更時には下記コマンドで確認していた。

$ logrotate -d [変更したファイル]

上記でエラーが出ていないことは確認していたのだが、今回このメッセージが出ているのは何故であろう…。いつから出力されているのかまでは追っていないがとりあえず現状で問題が無いかを確認する。

まずは直近で変更したファイルを元にlogrotateされる対象のファイルが、現在正しくlogrotateされているかを確認してみると問題なくされていた。続いてコマンドで確認する。

$ logrotate -vd /etc/logrotate.conf

上記にて、直近で変更したファイルだけでなく全てを対象として確認したのだが、目で見る限りエラーのような箇所はない。下記コマンドでも確認したが何も見つからない。

$ logrotate -vd /etc/logrotate.conf |& grep ^error
$

しばらく様子を見ることにする。

以上。

apt-get upgradeできない

表題の通り。

■ 環境

  • Ubuntu 16.04

■ apt-get upgrade

とある環境で、下記のようなメッセージが出力された。

$ sudo apt-get upgrade
E: Could not get lock /var/lib/dpkg/lock - open (11: Resource temporarily unavailable)
E: Unable to lock the administration directory (/var/lib/dpkg/), is another process using it?
$

誰かが実行したのか?不明だが確認することに。

プロセスを確認したところ、過去に実行されたまま放置されているプロセスが存在した。

$ ps -ef | grep apt
root       654 31494  0 11:19 pts/1    00:00:00 grep --color=auto apt
root     23198     1  0 Nov15 ?        00:00:00 sudo apt-get upgrade -y
root     23199 23198  0 Nov15 ?        00:02:39 apt-get upgrade -y
$
$ sudo kill 23198
$

プロセスを`kill`し再度実行。

$ sudo apt-get upgrade
E: dpkg was interrupted, you must manually run 'sudo dpkg --configure -a' to correct the problem.
$

出力されたメッセージの通り実行すると、過去の実行したまま入力待ちの状態であったようだ。

$ sudo dpkg --configure -a

最後に再度`upgrade`を実行する。

$ sudo apt-get upgrade

以上。

cutで変数から切り出す

shellスクリプトにおいて表題の通り。

■ 環境

  • sh
  • Linux

■ cut

shellスクリプト内で変数の一部を切り出したい。”.“や”“などデリミタがはっきりしている変数の内容であれば楽なのだが今回は「3文字目から2文字」を抜き出したい。いわゆる”substr“的なことをやりたかった。`cut`でできるようだ。

$ echo "123456789" | cut -c '7-8'
78
$

上記のように切り出すことができる。

$ echo "123456789" | cut -c '3-7'
34567
$

下記のようなことも可能である。

$ echo "123456789" | cut -c '3'
3
$ echo "123456789" | cut -c '3,6'
36
$

以上。

ファイルが0byteでないかチェック

shellスクリプトにおいて表題を行いたい。

■ 環境

  • Linux

■ if

スクリプトの中で、ファイルが”0byte“であるかどうかチェックを行いたい。普段使う`if`での条件には、対象がファイルやディレクトリかであるのチェックである”-f“とか”-d“といったものを使っていたのだが、対象のファイルが存在しかつ”0byte“ではない、ということをチェックしたかった。`man`で見ると下記の通り。

$ man test
  :
       -s FILE
              FILE exists and has a size greater than zero
$

やりたいことそのままのオプションがあった。

以上。