- 投稿日:2019-08-16T21:57:22+09:00
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"をターミナルで叩けば、現在の設定値が一覧表示されます。
この設定はうちの会社(の様なもの)のレンタルサーバに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を使えるので色々とお気楽。
VirtualBoxのUbuntuに、nodeやらアパッチやらを好きなだけインストールして、MacOS側からはsshやsambaで接続して操作する感じです。
念の為。時折切りが良い時に、開発環境が入った仮想マシンをエキスポートしておくのは必須です。たまに具合おかしくなりますから。
- 投稿日:2019-08-16T21:35:38+09:00
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}に順に格納される。
- 投稿日:2019-08-16T17:00:45+09:00
AmazonLinux2にtmux2.9をインストールする
普通にyumでインストールすると古いバージョンが入ってしまう。
# yum update -y # yum install -y tmux # tmux -V tmux 1.8tmux2.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
- 投稿日:2019-08-16T16:09:27+09:00
Linux デスクトップ Ctrl+;(セミコロン) で起動するクリップボードヒストリ
Ctrl+;をカスタムショートカットキーとして割り当てたかったのですが、よくわからないクリップボードヒストリに横取りされてしまいます。
特に有効にしているクリップボードマネージャはなく、無効にする方法がわからず苦労しました。結論
- Fcitx の Clipboard アドオン有効になっているのが原因でした。これに気づくのに時間がかかった。
- Manjaro MATE ではおそらくデフォルト有効でした。ディストリビューションによって違うかもしれません。
- Fcitx 設定アプリ → アドオン → Clipboard を開き、「クリップボード履歴リストのトリガーキー」を除去することで、機能を無効化できました。
- 投稿日:2019-08-16T16:02:17+09:00
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バイト以上のメモリ確保が必要になった場合領域の確保に失敗する。
②別用途のメモリにアクセス可能
プロセスは使用するメモリのアドレスを指定すれば対象の領域にアクセス出来てしまう。
例えばカーネルが使用しているメモリのアドレスにプロセスが割り当てられた場合、データの漏洩や破壊のリスクがある。
③マルチプロセスの扱いが困難
複数のプロセスを同時に動かす場合例えば同一のプログラムを実行した際は、そのプログラムに定義されたメモリのアドレスが重複している為、正しく動作しない。
また異なるプログラムであっても同様に
メモリのアドレスが重複した場合(確報したいメモリの量が少しでも重複した場合も同様)正しく動作しない。仮想記憶
上述した問題を解決する為の機能。
プログラム(システム)に「定義されたアドレス」=「物理アドレス」に「プロセスから見たメモリのアドレス」=「仮想アドレスを割り当てる」事を指す。またアドレスによってアドレス可能な範囲を「アドレス空間」と呼ぶ。
なおプロセスから直接物理アドレスにむけてアクセスする事は出来ない仕様。
- 投稿日:2019-08-16T13:57:38+09:00
#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なんぞやってレベルであること。とりあえずググってみた
解決策は[ $mysql.server start ]
スクリーンショットの検索結果は、残念ながら解決策よりも高等な解決策を示されていた。
以下のURLを参考にしていただきたいです。
https://qiita.com/itooww/items/13055c8bb1d226ee5844原因は再起動によるMySQLの活動停止
当たり前だが、再起動とか電源切るとアプリケーションは止まる。
ただ、エンジニアになって自分がどういう物を使っているかをイメージできないことも多い。
バグだとか、壊れたわけではないが原因がわからないと解決の仕様が無い。。。こうならないための対策
MySQLの自動起動です。これでいちいち立ち上げなくてもよくなります!
https://qiita.com/rinkun/items/c1649bcbe9a79bf2b07e
- 投稿日:2019-08-16T12:36:49+09:00
あのコマンドを発動させてみた(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"はほぼ全てを消せるコマンドのようですね。
私の知識ではここからどうやって復活させるのかわかりません。
こうなったらもう最初からインストールした方が早いので、やる必要もありませんが。
- 投稿日:2019-08-16T12:27:26+09:00
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
- 投稿日:2019-08-16T12:10:28+09:00
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のターミナルから仮想完了にログインしてシェル操作すること。
- 投稿日:2019-08-16T10:56:25+09:00
telnetの代わりにcurl、nc
- 投稿日:2019-08-16T08:16:12+09:00
Raspberry Pi 3 が可愛いのでSSHログイン時にscreenfetchが表示されるようにした話
Raspberry Pi 3 が可愛いのでSSHログイン時にscreenfetchが表示されるようにした話
うちのRaspberry Pi 3ちゃんです。かわいいですねー
たまりすぎた家電量販店のポイントで、血迷ってRaspberrypi 3を購入しました。
正確にはRaspberry Pi 3 Model B+ですね。セットアップについて
セットアップは以下を参考にさせていただきました。
つっかかったところとしては、電源投入時にLEDが赤色→緑色(SDカード読み込み状態)にならず、起動しないというのがありました。
以下を試して、解決しました。
電源をこれに変える
micoroSDを変えてOSを入れる
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.shsudo権限で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_





