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
$

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

以上。

date -d

表題をメモ。

■ 環境

  • GNU date
  • Linux

■ date

下記のような文字列がある。

May 28 23:59:59 2020 GMT

これをスクリプトの中で扱いたい、かつ動かしているホストではJSTなので表示も変換したりしたい。

$ date -d "May 28 23:59:59 2020 GMT"
Fri May 29 08:59:59 JST 2020
$

自身の指定するフォーマットで欲しい。

$ date -d "Fri May 29 08:59:59 JST 2020" +%s
1590710399

以上。

■ 関連

dateで前日の日付

dateでunixtimeを文字列に変換

date +%N

 

sudo: no tty present and no askpass program specified

表題のエラーが出ていたのでメモ。

■ 環境

  • Ubuntu 14.04, 16.04

■ sudo

`sudo`を使っている箇所で表題のメッセージが出力され、正しく値を取得できていないようであった。

sudo: no tty present and no askpass program specified

何かの作業のタイミングで”/etc/sudoers“が書き換わっていたのが原因のようであった。`sudo`を実行するユーザに権限がなくなってしまっていた。

$ sudo visudo

正しく編集し保存した。再度実行したところ、想定通りの結果を得られるようになった。

以上。