20190816のLinuxに関する記事は11件です。

VirtualBoxでSSH接続して色々作業(npm installとか)した時、あっちに逝ったまま帰ってこなくなる問題の対策

環境概要

JamstackやWordPressの開発専用環境としてVirtualBoxにlinux(Ubuntu 18.0.4)をインストールして、ターミナルやVs CodeのRemote-SSH機能でSSH接続してコマンド操作しています。

問題

SSHで重たいコマンド操作(npm installなど)をする際に冗長だったり処理が重かったり時間掛かり過ぎると、そのままハングして反応が無くなる。

解決方法

"/etc/security/limits.conf"でリソース制限をした。

詳しくはulimitでユーザリソースの制限(Linux)(インフラ勉強wiki)で。

上述の"limits.conf"を以下の様に設定。coderがユーザ名です。再ログインするだけで設定が反映されます。

coder hard nofile 1024
coder hard nproc 1000000
coder hard stac 1024

これで快適にnpm installやgridsome build / developなどをぶんまわせる様になりました。時々怪しくなる時もありますが、少し待てば動き始める事が殆どです。

なお"ulimit -a"をターミナルで叩けば、現在の設定値が一覧表示されます。

Screen Shot 2019-08-16 at 12.21.01.png

この設定はうちの会社(の様なもの)のレンタルサーバにSSHで接続して、ターミナルから"ulimit -a"して出てきた設定を参考にしました。

雑記

Macの黒い画面でnpmやったりとか色々してウエブ開発やるにはhomebrewをインストールしておけば、快適に開発できるものの、最近アップルがMacOSのセキュリティに力を入れ始めて面倒臭くなってまいりました。こんどのMacOSのバージョンアップでさらに面倒になりそうですし。

こんどのMacOS 10.15 Catalinaでは、デフォのシェルがzshに変わるらしい。10.16以降はPythonやRuby、Perlを同梱しなくなるとも。OSのアップグレードの度に、色々と無駄な作業が増えそうです。

Dockerを試してみました。お手軽なdocker環境が欲しい場合は、laradockがよかったです。WordPressとかも動かせます。ただし、dockerは肥大なキャッシュ(64GBとかそんな感じ)が障壁に。最近のお高いマックのSSDには負担すぎる。外部接続ディスクにキャッシュを移動できる事はできますが、少し使っているうちに色々ダルくなってきた。

というわけで、linuxの開発環境をそのままポータブルに扱える様に、Ubuntuで開発環境を作ってVirtualBoxで動かす事にしました。本体のSSDになるべく依存したくないのと、本体のSSDの空き容量を常に確保しておきたいため、開発環境は全てUSB3.0接続の外部SSDに置いています。管理作業はVirtualBoxからWindow ManagerでGUIを使えるので色々とお気楽。

Screen Shot 2019-08-16 at 14.03.17.png

VirtualBoxのUbuntuに、nodeやらアパッチやらを好きなだけインストールして、MacOS側からはsshやsambaで接続して操作する感じです。

念の為。時折切りが良い時に、開発環境が入った仮想マシンをエキスポートしておくのは必須です。たまに具合おかしくなりますから。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ShellScript Bash 終了コード で 詰まったところ

目的

  • パイプを使用したときのコマンドの終了コードについて詳しく知る。
    ※本記事の内容はbashの環境に依存します。同じbashでもこの方法だと解決しないことがあります。

この記事のターゲット

  • ログを出力しているShellScriptの終了コードが欲しい方
  • パイプより前の処理の終了コードが欲しい方

自分が困ったエピソード

  • test.shという名前のShellScriptのファイルを書いた。
  • 実行するときのコンソールログと終了コードが欲しかった。
  • 下記の様に当該スクリプトを実行した。
    ./test.sh 2>&1 | tee result.txt
  • 実行後にtest.shが正常終了したか知りたかったため下記の終了コードを返すコマンドを実行
    echo $?
  • 終了コードは0が返ってきた。
  • しかしresult.txtを確認したところ、エラー終了していた。
  • パイプを用いたコマンドを使用した場合にecho $?を実行するとtee result.txtの終了コードが返ってきてしまう。

解決方法

  • パイプで区切られた範囲の処理の終了コードが特定の配列に入るようになっているらしい。
    ${PIPESTATUS}という配列に結果が入っている。
  • その配列から欲しい処理の終了コードを抜き取ってあげればOK

詳細

  • 下記の様なパイプを多用した処理を例にする。
$ 処理1 | 処理2 | 処理3
  • 一連の処理の終了コードはそれぞれ下記の様に配列${PIPESTATUS}に格納されている。

    • 処理1の終了コード → 配列${PAPESTATUS}の0番目に格納
    • 処理2の終了コード → 配列${PAPESTATUS}の1番目に格納
    • 処理3の終了コード → 配列${PAPESTATUS}の2番目に格納
  • 一連の処理の終了コードを出力したいときは下記の様に出力する。

    • 処理1の終了コードをコンソールに表示 → echo "${PAPESTATUS{0}}"
    • 処理2の終了コードをコンソールに表示 → echo "${PAPESTATUS{1}}"
    • 処理3の終了コードをコンソールに表示 → echo "${PAPESTATUS{2}}"

まとめ

  • パイプを使用した処理の終了コードについてまとめた。
  • パイプで区切られた処理の終了コードは配列${PAPESTATUS}に順に格納される。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AmazonLinux2にtmux2.9をインストールする

普通にyumでインストールすると古いバージョンが入ってしまう。

# yum update -y
# yum install -y tmux
# tmux -V
tmux 1.8

tmux2.9を入れる

# cd /usr/local/src/
# wget https://github.com/tmux/tmux/releases/download/2.9/tmux-2.9.tar.gz
# tar -xvf tmux-2.9.tar.gz
# cd tmux-2.9/
# ./configure --prefix=/usr/local/tmux && make
# make install
# tmux -V
tmux 2.9
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Linux デスクトップ Ctrl+;(セミコロン) で起動するクリップボードヒストリ

Ctrl+; をカスタムショートカットキーとして割り当てたかったのですが、よくわからないクリップボードヒストリに横取りされてしまいます。
特に有効にしているクリップボードマネージャはなく、無効にする方法がわからず苦労しました。

結論

  • Fcitx の Clipboard アドオン有効になっているのが原因でした。これに気づくのに時間がかかった。
    • Manjaro MATE ではおそらくデフォルト有効でした。ディストリビューションによって違うかもしれません。
  • Fcitx 設定アプリ → アドオン → Clipboard を開き、「クリップボード履歴リストのトリガーキー」を除去することで、機能を無効化できました。

Screenshot at 2019-08-16 16-00-54.png

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Linuxのメモリ管理について(その①)

メモリのフィールド

メモリには4つのフィールドがある。

  • totalフィールド:全メモリの量
  • freeフィールド:見かけ上の空きメモリ(解放前のメモリの量)
  • buff/cacheフィールド:バッファ,ページキャッシュが使用するメモリの量。frreフィールドの空きメモリが足りなくなった際に解放される。
  • availableフィールド:実質的な空きメモリ
■availableフィールドの内訳
freeフィールド+buff/cacheフィールド(一部)+カーネルのメモリの解放可能なメモリの量(一部)

Out Of Memory

メモリの使用量が増えavailableフィールドの解放をもっても対処出来なかった場合の事を指す。

Out of Memoryが発生した場合、適当なプロセスを強制終了させるOOM killerという機能が実行される。

一般的にOOM killerはsysctlのvm.panic_on_oomのパラメータを1に変更する事でOut of Memory発生時にシステムを強制終了にしている事が多い模様。

カーネルのメモリ割り当て

カーネルがプロセルにメモリを割り当てるのは2パターンある。

①プロセス生成時のタイミング 
②プロセス生成後、追加で動的にメモリを割り当てるタイミング

②では以下のような問題がある。

①メモリの断片化
②別用途のメモリにアクセス可能
③マルチプロセルの扱いが困難

①メモリの断片化

プロセスが生成された後、メモリの確保、解放を繰り返した際に発生する。

例えば合計600バイトのメモリで300バイトのメモリがプロセスが使用する際、100バイトずつ確保したとする。その際、プロセスが100バイト以上のメモリ確保が必要になった場合領域の確保に失敗する。

②別用途のメモリにアクセス可能

プロセスは使用するメモリのアドレスを指定すれば対象の領域にアクセス出来てしまう。

例えばカーネルが使用しているメモリのアドレスにプロセスが割り当てられた場合、データの漏洩や破壊のリスクがある。

③マルチプロセスの扱いが困難

複数のプロセスを同時に動かす場合例えば同一のプログラムを実行した際は、そのプログラムに定義されたメモリのアドレスが重複している為、正しく動作しない。
また異なるプログラムであっても同様に
メモリのアドレスが重複した場合(確報したいメモリの量が少しでも重複した場合も同様)正しく動作しない。

仮想記憶

上述した問題を解決する為の機能。
プログラム(システム)に「定義されたアドレス」=「物理アドレス」に「プロセスから見たメモリのアドレス」=「仮想アドレスを割り当てる」事を指す。

またアドレスによってアドレス可能な範囲を「アドレス空間」と呼ぶ。
なおプロセスから直接物理アドレスにむけてアクセスする事は出来ない仕様。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

#Mysql2::Error: Can't connect to MySQL server onについて

起こったこと

備忘録です。低レベルですが、同じエラーを起こしてしまった人のために。
MacOSのアプデを自動でしているため、再起動に入ってしまった。
アプデ後、bundle startをしてもうまく起動しない。
いつもならターミナルがbashからrubyに変わるのに跳ねられてしまう。
色々調べていると、次のエラー文がみられた。

Mysql2::Error: Can't connect to MySQL server on なんちゃら

あんまり英語が得意ではないが、MysqlがCan't connectなので接続で来てないらしい。
さてここで重要なのは、僕が初心者すぎてMysqlなんぞやってレベルであること。

とりあえずググってみた

スクリーンショット 2019-08-16 13.37.36.png

解決策は[ $mysql.server start ]

スクリーンショットの検索結果は、残念ながら解決策よりも高等な解決策を示されていた。
以下のURLを参考にしていただきたいです。
https://qiita.com/itooww/items/13055c8bb1d226ee5844

原因は再起動によるMySQLの活動停止

当たり前だが、再起動とか電源切るとアプリケーションは止まる。
ただ、エンジニアになって自分がどういう物を使っているかをイメージできないことも多い。
バグだとか、壊れたわけではないが原因がわからないと解決の仕様が無い。。。

こうならないための対策

MySQLの自動起動です。これでいちいち立ち上げなくてもよくなります!
https://qiita.com/rinkun/items/c1649bcbe9a79bf2b07e

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

あのコマンドを発動させてみた(rm -rf /)

概要

エンジニアになれば一度は聞いたことあるであろう全てを消去するコマンド "rm -rf /"。
実際にやったことがなかったので試してみることにした。(←暇なの?)
もちろん仮想環境で試します(Dockerコンテナ)

実行環境

CentOS Linux release 7.5.1804 (Core)

実行!

仮想環境を起動し、おもむろにこのコマンドを入力する。

bash-4.2# rm -rf /

さあ、本当に消えるのだろうか。
実行!

bash-4.2# rm -rf /
rm: it is dangerous to operate recursively on '/'
rm: use --no-preserve-root to override this failsafe

・・・消えない
しかし、このオプション "--no-preserve-root" をつければいけそう。
改めて実行!

bash-4.2# rm -rf / --no-preserve-root

これで消えました。が、全てを消すことはできず、read-onlyになっているファイルは消せないと警告がでました。
本当に消えたのか ls コマンドを実行してみようとするが、コマンドがないため見れず。
というか、ありとあらゆるコマンドが使えなくなった。そりゃ全部消したんだからそうですよね。

生き残ったコマンドたち

!          bg         command    dirs       enable     fc         help       local      read       shopt      trap       unset
./         bind       compgen    disown     esac       fg         history    logout     readarray  source     true       until
:          break      complete   do         eval       fi         if         mapfile    readonly   suspend    type       wait
[          builtin    compopt    done       exec       for        in         popd       return     test       typeset    while
[[         caller     continue   echo       exit       function   jobs       printf     select     then       ulimit     {
]]         case       coproc     elif       export     getopts    kill       pushd      set        time       umask      }
alias      cd         declare    else       false      hash       let        pwd        shift      times      unalias

生き残ったファイルたち(配下の全てが無事というわけではなく一部だけ残っている)

dev/  etc/  proc/ sys/

以上!
"rm -rf / --no-preserve-root"はほぼ全てを消せるコマンドのようですね。
私の知識ではここからどうやって復活させるのかわかりません。
こうなったらもう最初からインストールした方が早いので、やる必要もありませんが。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ffmpegでヲタ芸の練習用動画をつくる

youtubeにアップされているヲタ芸動画をもとに、練習用動画を作る方法です。
「練習用動画」とは、「左右が反転されていて再生速度を遅くした動画」とします。

動画のダウンロード

ダウンロードには「youtube-dl」を使います。
取り回しが良いように、640x480のmp4をDLします(-f 18の部分で指定)。

$ youtube-dl -f 18 -o src.mp4 「youtube ID」

必要部分の切り出し

全編では長い場合は、必要部分のみを切り出します。
以下は、src.mp4の0秒から1分30秒(90秒)までを切り出す場合です。

$ ffmpeg -ss 0 -i src.mp4 -t 90 cut.mp4

左右反転

練習しやすいように、左右を反転させます。

$ ffmpeg -i cut.mp4 -vf hflip mirror.mp4

スロー

初めから通常スピードではできないので、スローの動画も作ります。
下記は、0.5倍速と0.8倍速の動画を作っています。

$ ffmpeg -i mirror.mp4 -vf setpts=PTS/0.5 -af atempo=0.5 x05.mp4
$ ffmpeg -i mirror.mp4 -vf setpts=PTS/0.8 -af atempo=0.8 x08.mp4

おまけ:動画から静止画の切り出し

動きの確認のために、動画から静止画を抜き出します。
下記は秒間10フレームで静止画を切り出す指定です。1秒の動画から10ファイルの静止画ができます。

$ ffmpeg -i mirror.mp4 -vcodec png -r 10 image_%03d.png

参考:
https://qiita.com/livlea/items/a94df4667c0eb37d859f
https://qiita.com/kitar/items/d293e3962ade087fd850
http://fftest33.blog.fc2.com/blog-entry-36.html
https://qiita.com/YusukeSuzuki@github/items/aff145f78ec236319afb
https://takuya-1st.hatenablog.jp/entry/2013/08/30/211917
http://fftest33.blog.fc2.com/blog-entry-36.html
https://qiita.com/livlea/items/a94df4667c0eb37d859f#-%E5%8B%95%E7%94%BB%E3%81%8B%E3%82%89%E9%80%A3%E7%95%AA%E7%94%BB%E5%83%8F%E3%82%92%E4%BD%9C%E6%88%90

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

VirtualBoxのネットワークアダプタの設定の際に出てくる用語を調べた。

最近Linuxの勉強中です。
MacにVirtualBoxからcentOS7を入れて操作しながら学んでいるのですが、VirtualBoxの設定中に知らない単語が多かったので調べてまとめました。
まずたどり着いたのは@taopi様の記事でしたが、その中で出てきた用語もわからなかったのも合わせて調べました。

ネットワークアダプタ

ネットワークカードと同義。
物理的にはLANケーブルをパソコンにさすための「穴」の事。
インターネットを使うときに必要な(パソコンにくっつける)部品。

ホストマシン、仮想マシン

・ホストマシン
仮想マシンを入れるためのマシン

・仮想マシン
仮想的に作り出されたハードウェア。
一台の物理サーバに対し複数の仮想サーバを作り出し稼働させるのが仮想マシン。

1台のマシンに1つのアプリケーションとして使うと、アプリケーションによってはパソコンのパワーが有り余る事がある。
余っているパワーをうまく使うために、ホストマシン、仮想マシンという関係を築く。
ホストマシンに仮想マシンをたくさん作り、それぞれにアプリケーションを作っていけば、ホストマシンのパワーを存分に使うことができる。

参考サイト:5分でわかる「仮想マシン」とは?今さら聞けない基礎・基本を解説

VM (VMware)

1台のコンピューター上で、複数OSの実行を可能とする仮想マシンのソフトウェアのうちの一つ。

1台のパソコンで、WindowsとLinuxなどの複数のOSを使うには、「デュアルブート」や「マルチブート」という方法もある。しかし、これらの方法は、OSの同時実行は不可能で、パソコン起動時にいずれかのOSを選択しなければならない。従って、別のOSを使いたい場合は、パソコンを再起動する必要があった。だが、VMwareを使えば、ホストOSと呼ばれるメインのOS下で、あたかもホストOSにインストールされているアプリケーションの中の一つのように、他のOSを利用することができる。
参考サイト:コトバンク:VMware(読み)ぶいえむうぇあ

DHCP

IPアドレスを自動で割り当ててくれる仕組み

NAT

globalIPアドレスをプライベートipアドレスに(その逆も)変換できる仕組み。
プライベートipアドレスだけだとインターネットに接続できない!(プライベートipアドレスは、身内でしかわからない住所のため)
NATを使って、身内外にもわかってもらうipアドレスに変換する必要がある。
家の中で、パパの部屋、トイレ、物置というのは家族しか知らない場所。
郵便物の差出人をパパの部屋のhoge太郎とかにしてポストに投函したら、受け取った人は「え?」となって返信お手紙かけないので困る。
ちゃんと家の住所を差出人欄に書こう!
参考サイト:NATとは

NAPT

NATをパワーアップさせ、1つのglobalIPで複数台のコンピュータがインターネットできるようにするネットワークアドレス変換技術

NATネットワーク

NATはVM毎に作られる、VM同士の通信はできない。
1つのNATで複数のVM同士で使うことができるようにしたものをNATネットワークという。
VM間でのやりとりが可能となる。

内部ネットワーク

身内メンバーのやりとりが基本です。ここで言う身内はVM同士です。
外部ネットワークはインターネット側

ホストオンリーアダプタ

VM同士の通信に加え、ホストマシンとも通信を行うことができる。
ホストオンリーアダプタの設定だけでは、仮想マシンからはインターネットに接続できない。
NAT+ホストオンリーアダプタの設定を行うと可能。

ブリッジ接続

・ネットワークの話でのブリッジ
複数のネットワークを1つのネットワークにまとめること。
VM側でホストのネットワークを使用する事ができる。

・ルータの話でのブリッジ
ルータのモーをブリッジモードにすると、ルータがスイッチングハブとして使えるようになる。
複数のパソコンを同じネットワーク内にまとめる事ができる。

ssh接続

ssh接続とは、暗号化され安全なsshプロトコルを使用して、外部にあるコンピュータへリモート接続して、OS上のコマンド(シェル)操作を行うことをいいます。
仮想環境にホストから安全にアクセスする。
参考サイト:イー・アルゴリズム

私の環境だと、MACにvirtualBoxでCentOS7を入れたので、sshでMacのターミナルから仮想完了にログインしてシェル操作すること。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

telnetの代わりにcurl、nc

サーバによってコマンドが入っていたり入っていなかったりなので、メモ

telnet

telnet <host> <port>

curl

curl -v telnet://<host>:<port>

nc

nc -vz <host> <port>
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Raspberry Pi 3 が可愛いのでSSHログイン時にscreenfetchが表示されるようにした話

Raspberry Pi 3 が可愛いのでSSHログイン時にscreenfetchが表示されるようにした話

うちのRaspberry Pi 3ちゃんです。かわいいですねー

IMG_20190815_072901.jpg
たまりすぎた家電量販店のポイントで、血迷ってRaspberrypi 3を購入しました。

正確にはRaspberry Pi 3 Model B+ですね。

セットアップについて

セットアップは以下を参考にさせていただきました。

つっかかったところとしては、電源投入時にLEDが赤色→緑色(SDカード読み込み状態)にならず、起動しないというのがありました。
以下を試して、解決しました。

  1. 電源をこれに変える

  2. micoroSDを変えてOSを入れる

  3. OSを、micoroSDに書き込む形式ではなくNOOBSでmicoroSDにファイルを置く形式に変える

電源を変えても解決しなかったので、2と3を試した感じです。

SSHログイン時にRaspbianのロゴを表示させるように設定する

買ったはいいもの、特に何かに使う予定もないので、徒然なるままにSSHログイン時にRaspbianロゴが表示されるように設定しました。

Screenfetchインストール

まずはScreenfetchをインストールします

pi@raspberrypi:~ $ sudo apt-get install screenfetch

ログイン時にScreenfetchの実行結果を出力するように設定する

こちらを参考にさせていただいたところ、以下にScreenfetchの実行結果を反映すれば、ログイン時にScreenfetchの実行結果が出力されることがわかりました。

/etc/motd

以下のコマンドを実行して、/etc/motdにScreenfetchの実行結果を動的に反映してくれるスクリプトを取得します。

pi@raspberrypi:~ $ sudo wget --no-check-certificate -P /usr/local/bin/ 'https://gist.github.com/ysaotome/5997652/raw/fecdf757b348debfcdd866df00f6d567ff749623/update_motd_by_screenfetch.sh'

スクリプトを実行できるように実行権限を付与します。

pi@raspberrypi:~ $ sudo chmod +x /usr/local/bin/update_motd_by_screenfetch.sh
pi@raspberrypi:~ $ ls -la /usr/local/bin/update_motd_by_screenfetch.sh
-rwxr-xr-x 1 root root 792  8月 14 08:03 /usr/local/bin/update_motd_by_screenfetch.sh

sudo権限でScreenfetchをインストールしたからなのか、スクリプト内に記載されているScreenfetchのパスが違っていたので、修正します。

pi@raspberrypi:~ $ cat /usr/local/bin/update_motd_by_screenfetch.sh
#!/bin/bash
# Description:UpdateMotd by Screenfetch
(略)
# BIN_SCREENFETCH='/usr/local/bin/screenfetch'   ← コメントアウト
BIN_SCREENFETCH='/usr/bin/screenfetch'           ← 追記
(略)

また、このままスクリプトを実行しても、/etc/motdへのアクセスが拒否られましたと表示されてしまうので
以下を実行しました.
chmod 777やっちゃダメでしょという感じですが、chmod 755がなぜか効きませんでした。。

pi@raspberrypi:~# sudo chmod 777 /etc/motd
pi@raspberrypi:~# ls -la /etc/motd
-rwxrwxrwx 1 root root 286  6  7 00:42 /etc/motd

後はスクリプトが5分ごとに実行されるように以下を実行します。

pi@raspberrypi:~# sudo -i
root@raspberrypi:~# /bin/cat << _UPDATEMOTD_ > /etc/cron.d/update-motd
> #update-moted
> */5 * * * * root /usr/local/bin/update_motd_by_screenfetch.sh
> _UPDATEMOTD_

ログアウトしてから再度ログインすると
↓こんな感じに表示されるはず!
20190816_080357000000.JPG

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む