[TOC]
1. ターミナルコマンド
1.1. 7z
概要
高い圧縮率
インストール
brew install p7zip
使用方法:
解凍:
7z x 2017男性.7z
参考資料
1.2. ssh
オプション
L
(ex)ssh -L
ローカル (クライアント) ホスト上の指定の TCP ポートまたはUnixソケットが、与えられたリモートホスト上のポートに転送されるよう指定します.-f
ssh がコマンドを実行する直前に、バックグラウンドに移行するよう指示します。これは-n オプションも含んでいます。-N
リモートコマンドを実行しません。これはポート転送のみをおこないたい場合に便利です。
1.3. grep
- 自分のMacでは+(直前の文字・単語の1回以上の繰り返し)は使えない
- 正規表現
grep seg[0-9]*\.csv
1.4. top
表示項目を限定
表示単位の変換(MiB->GB->Peta) 総合情報:
E
,プロセス情報e
更新頻度の変更 起動時:
top -d 5
->5秒おきに更新d
はdelay-timeの略 起動後:s
を押すとchange delay from ?? to
と表示されるので更新間隔を指定ユーザー(user)指定 起動時:
top -u {username}
, 起動後:u
を押すとWhich User
と聞かれるので指定したいユーザー名を入力コマンドをオプションを含めて表示 起動時:
top -c
起動後:
c
を押すとCOMMAND
にオプションも含めて実行コマンドが表示される表示項目を指定(プロセスID, PIDやCPU使用率,コマンド名など) 起動後:
f
(formatの略)を入力すると表示項目を選択できる画面に移行.使い方は一番上に書いてある.(移動は方向キー,d
やスペースキー
で項目を表示切り替え,s
でソート項目の指定q
で設定完了)
cpu使用率をみる
top + 1
仮想メモリはVIRT、物理メモリはRESで確認(defaultの単位はKB)
プロセスを強制終了する
k
コマンドの後PID入力→シグナル番号入力(強制終了は9)
1.5. ps(process status)
用語の定義
- 端末(TTYやTT)
- 仮想端末(pts/{num})
Linux(リモートログイン時)→(tmuxを含めた)各window毎に与えられる - 実端末(ttys)
(Local Mac等)→(tmuxを含めた)各window毎に与えられる
- 仮想端末(pts/{num})
- 端末(TTYやTT)
基本
option無しでは実端末+現在の端末上の現在実行中のプロセスを表示Option
u
(ps u
)
自分が作成した全ての仮想端末+実端末のプロセスをcpuやメモリの資料率も含めて表示a
(all user)
全てのユーザーのprocessを表示
便利機能
-
ps -eo lstart,pid,args
-e
:全プロセスを表示-o
:指定したリスト順の出力形式で表示する(lstart
->プロセスの起動日時,pid
->プロセスID,args
->文字列の引き数がついたコマンド)
-
1.6. lsof (ls open file)
- 基本
読み取り権限があるユーザーが開いたportを確認
$lsof -i
プロセスが使用してるportを調べる.NAME->ファイルorポート- 特定のport番号が空いているか確認
lsof -i:{port}
- ポート{port}が使われていたら削除
lsof -ti:{port} | xargs kill -9
(-t
プロセスidだけ取得 )
1.7. ln
- example
- create symbolic link between fils()
%ln -s /absolute/path/to/file or Directory/ /absolute/path/to/symlink(exclude /)
-s
symbolic link
or
%cd /path/to/symlink
%ln -s /relative/path/to/file or Directory/ ./
- remove symbolic link
unlink /path/to/symbolic link
- remove all symbolic links in directory
%find /path/to/symlink/directory/ -type l -delete
%cd /path/to/symlink/directory
% find ./
- create symbolic link between fils()
1.8. tree
ディレクトリを階層的に表示
オプション-N
:文字化け防止, -L
:深さを指定, -I directory
:表示させたくないディレクトリorファイル,-d
:ディレクトリのみ表示
(実行例)tree -Nd -I 'Ras01|Ras04|Ras07'
1.9. find
- share directory and file recursevely(no change on symbolic link)
(Directory->rwx, files(.py, image)->rw, .sh->rwx)
# give "Others" the right to read, write and xecute Directorys
find /path/to/dir -type d | xargs -I% chmod o=rwx %
# give "Others" the right to read and write filess
find /path/to/dir -type f | xargs -I% chmod o=rw %
# give "Others" the right to read, write and xecute *.sh files
find /path/to/dir -type f -iname "*.sh" | xargs -I% chmod o=rwx %
変更されたくないないファイルやディレクトリを共有
・変更されたくないディレクトリは読み取りと実行権限だけ与える
変更とはファイル・ディレクトリの削除・追加・移動
・変更されたくないファイルは読み取り権限だけ与える
・*.shファイルのみ読み込みと実行権限を与える
findで検索したファイルを一括で移動させる
find -option | xargs -I% mv % to_path
- xargs
- -I replace-str
Replace occurrences of replace-str in the initial-arguments with names read from standard input. Also, unquoted blanks do not terminate input items; instead the separator is the newlinecharacter. Implies -x and -L 1.
- -I replace-str
- xargs
特定の文字列を含むファイルや行を表示
#aliasという文字列を含むファイルパスを表示 # -iname "*"で隠しファイルも表示 # -lでファイル名のみ表示 find ~/ -type f -name "*" -maxdepth 1 | xargs grep -l alias #aliasという文字列を含むファイルパスと行番号を表示 #-nで行番号も表示 find ~/ -type f -name "*" -maxdepth 1 | xargs grep -n alias
- Option
- Set the depth of serch
-mindepth/-maxdepth
- Base of file(not path) name matches shell pattern.(case insentitive)
-name(-iname)
*
-> any number of characters?
-> any single character
- file/directory
-type f/d
- Set the depth of serch
2. コマンド逆引き
2.1. ファイル転送を再開するコマンド
dsサーバーバーの /data0/akirat/tmpディレクトリを /home/akiratに差分のみコピー
rsync -av -e ssh ds:/data0/akirat/tmp /Users/akirat/
※ディレクトリ配下の全てのディレクトリやファイルもコピーされる
※tmpの後に/をつけるとtmpディレクトリの中にあるファイルやディレクトリのみコピー
※-vは転送対象になったファイル、転送量等を表示
※-aは“再帰的にコピー“,”シンボリックリンクをそのままコピー“、”パーミッションの保持“などの複数のオプションをつけるのと等価(参考URL)
2.2. Linuxでディレクトリ構造のみコピー
https://ex1.m-yabe.com/archives/2039
2.3. 再帰的にディレクトリのファイルのみにシンボリックリンクを貼る方法
動機
シンボリックで作成されたディレクトリに新しいファイルやフォルダを追加すると元ディレクトリにファイルやフォルダが追加される仕様になっている. そのため,複数人で共有しているデータ(ディレクトリ)に対してシンボリックリンクを用いてディレクトリを作成した場合,そのディレクトリにファイルやディレクトリを追加するのは好ましくない. そのため,シンボリックで作成されたディレクトリに新しいファイルやフォルダを追加しても元ディレクトリに追加されない方法を紹介する.手順
/yyy/yyy/dest_dirのディレクトリにorigin_dirのシンボリックリンクを作成する方法(以下,origin_dirの絶対パスを/xxx/xxx/origin_dirと表す)- ディレクトリ構造のみをコピー
rsync -avz --include "*/" --exclude "*" /xxx/xxx/origin_dir /yyy/yyy/dest_dir
- 変数の定義(TOの末尾のorigin_dirを忘れないこと)
FROM=/xxx/xxx/origin_dir
TO=/yyy/yyy/dest_dir/origin_dir
- ファイルのみシンボリックを貼る
find $FROM -type f | sed -e 's#'$FROM'/##'| xargs -I% ln -s $FROM/% $TO/%
- ディレクトリ構造のみをコピー
コマンドの簡単な解説
- find
$FROM以下のファイルの絶対パスを表示 - sed
$FROMという文字列を空白で置換- 参考資料
sedの/は任意の記号で代用できる(パスを置換する時に超便利)
http://akuwano.hatenablog.jp/entry/20120411/1334114116
- 参考資料
- xargs
パイプ“|”で渡された引数を%として保持し,lnコマンドを実行.つまり$FROM/%
のシンボリックリンクを$TO/%
に貼る.
- find
2.4. スクリプト(プロセス)を実行した時刻を調べる
背景 pythonコードの中でログを残すのを忘れていたり
time python
などしてなくてpythonコードを実行した時間が分からない場合に調べる方法(ちなみにtop
コマンドのTIME
欄はCPUを使用している時間なのでプログラムを実行させた時間と異なる) ※既に実行が終わったプロセスの実行時間は分からない手順
プロセスIDを調べる
$pgrep -a -u akirat -f "python.*IntroVAE32sPy_v02.py" >203548 python IntroVAE32sPy_v02.py --ver 0 -w 15女性 -i 顔+腕 --gpus 1 >203549 python IntroVAE32sPy_v02.py --ver 0 -w 15女性 -i 顔+肩 --gpus 1 >203566 python IntroVAE32sPy_v02.py --ver 0 -w 15女性 -i 顔+足 --gpus 1 >...
-a
->コマンドラインも表示,-u
->Userを指定,-f(--full)
->コマンドラインを正規表現で絞り込みマッチ 並列計算等で1実行で複数プロセスが立ち上がる場合があるので,PIDのみ取得してtop
コマンドで目的のプロセスを取得#正規表現にマッチしたPIDをカンマ区切りで取得 -d(--delimiter) $pgrep -d',' -u akirat -f "python.*IntroVAE32sPy_v02.py" >337603,329249,335298 #特定のPIDのみを5秒毎に監視 -d Delay-time -c Command-Line $top -c -d 5 -p 337603,329249,335298
Command
>top
>表示項目を限定
を見るとtopコマンドの表示項目を絞ることができる.プロセスの開始時間を表示
#特定のプロセスIDの起動時間(lstart),経過時間(etime),args(コマンド)を表示 #※-o:出力フォーマットの指定 ps -o lstart,etime,pid,args -p 337603,335298 STARTED ELAPSED PID COMMAND >Mon Dec 31 13:23:15 2018 3-09:51:33 335298 python IntroVAE32sPy_v02.py --ver 0 -w 15女性 -i 顔+腕 --gpus 1 >Mon Dec 31 13:24:05 2018 3-09:50:43 337603 python IntroVAE32sPy_v02.py --ver 0 -w 15女性 -i 顔+肩 --gpus 1
※出力フォーマット一部
| コード | ヘッダ | 意味 | | ------ | ------- | ---------------------------------- | | lstart | STARTED | コマンドが起動された時刻 | | etime | ELAPSED | プロセスが起動されてからの経過時間 | | args | COMMAND | 文字列の引き数がついたコマンド |
3. Linuxサーバー
3.1. 頻出コマンド備忘録
内容 | コマンド |
---|---|
CentOSのバージョンを調べる LinuxのOSバージョン確認方法 |
$cat /etc/redhat-release |
接続可能なサーバーのホスト名を調べる | $cat /etc/hosts |
新規アカウト作成 | $ sudo su - $useradd username $passwd username |
3.2. コマンド備忘録
内容 | コマンド |
---|---|
サーバーの接続確認 | ping hostname |
3.3. 使用の基礎
3.3.1. 使用する際の注意点
ストレージ(HDDやSSDなどのことで画像やテキストなどのプログララムの出力を保存する領域)の空きがあるか確認する必要がある
Linuxサーバーを使用する際にはCPU(制御・演算を行うデバイス)に負荷がかかり過ぎていないか,メモリ(データやプログラムを一時的に記憶するデバイス)に空きがあるか確認する必要があります
- GPUを使用する場合はGPUのメモリの使用状況も確認する必要あり
3.3.2. ストレージ
プログラム等で出力ファイルがある場合は実行前にストレージの空きがあるか確認しましょう
MacだとAppleマーク>このMacについて>ストレージ
等で確認することが出来ます.
Linuxサーバーの場合はdf -h
を用いることで調べることができます(-h
はhuman-readable
の略)
例えばds
サーバーの場合
$df -h
>ファイルシス サイズ 使用 残り 使用% マウント位置
>/dev/md126p3 208G 113G 96G 55% /
>..
>/dev/sda1 59T 7.0T 52T 12% /data0
となってあり,/
以下(/home/akirat/
も含まれる)のストレージは208G
あってそのうち113G
使用されており残り113G
使用可能なことが分かります.同様に/data0
は59T
の容量があることが分かります.
3.3.3. CPU
物理的に存在するコア数以上を動かさない 各CPUに負荷をかけすぎない(稼働率が100%以上になることようにしない)
- 使用可能なコア数の確認コマンド
lscpu
使用例と見方(gtx
の場合)
$lscpu
>...
>CPU(s): 56
>コアあたりのスレッド数:2
>ソケットあたりのコア数:14
>Socket(s): 2
>...
>Model name: Intel(R) Xeon(R) Gold 5120 CPU @ 2.20GHz
ソケット(マザーボード上にある、CPUを取り付ける場所)が2つあり各ソケットにコア(CPU)が14個あるので物理的に存在するコア(CPU)の数は28個. またコアあたりスレッド(CPUで認識されるコア数=論理コア数)が2つなので,サーバーが認識してるコア数(論理コア数)は28*2=56個. 物理的に28コアしかないのにそれを倍に見せかける(一人二役をさせる技術)をハイパースレッディングという.
※(CPU)コア->CPU内にある演算回路のことで,CPUの中には(CPU)コアを複数持つCPUが存在する.(2コアのデュアルコアや4コアのクアッドコアなど)
使用中の論理コアの使用率を確認する方法
$top
コマンドを押した後に数字の1
を入力するgtx
サーバーの例>Tasks: 655 total, 24 running, 623 sleeping, 0 stopped, 8 zombie >%Cpu0 : 22.4 us, 28.8 sy, 0.0 ni, 48.8 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st >%Cpu1 : 46.5 us, 14.7 sy, 0.0 ni, 38.2 id, 0.0 wa, 0.0 hi, 0.6 si, 0.0 st >...
論理コアが
0
番目のCPUが22.4%稼働している.
3.3.4. メモリ
使用可能なメモリ(available)を残す
使用可能なメモリは
free -h
コマンド出力のMem:
行のavailable
の項目 メモリ全体はMem:
行のtotal
の部分(h
オプションはhuman
の略)gtx
サーバーの例$free -h > total used free shared buff/cache >available >Mem: 250G 24G 21G 397M 204G 224G >Swap: 31G 0B 31G
※
Swap:
はメモリが足りなくなった時に使用されるHDのデータ領域でI/O(入出力)のパフォーマンスが遅い ※プロセスがデータ領域を使用する際には使用中のメモリー(Mem:
行used
)を始めに確保し,空きメモリ(Mem:
行free
)がある限り空き容量をメモリの中でI/Oのパフォーマンスが高いキャッシュ(Mem
:行buff/cache
)に割り当てる.そのためfree
コマンドでは空きメモリ(Mem:
行free
)は少なく表示されるが,新しいジョブが投入されたときには,キャッシュ(Mem
:行buff/cache
)の一部はすぐに開放し新しいジョブのデータ領域として使用できる.その領域がfree -h
コマンドMem:
行のavailable
項目 参考文献 Linux メモリの基礎 参考文献 メモリの図解 詳しく説明
3.3.5. GPU
GPUメモリ容量以上使わない(プログラムが自動停止する)
GPUの利用可能メモリを確認する方法
nvidia-smi
(5秒おきに更新したい場合はnvidia-smi -l 5
でl
はloopの略)gtx
サーバーの例$nvidia-smi >Wed Jan 2 00:46:39 2019 >+-----------------------------------------------------------------------------+ >| NVIDIA-SMI 410.48 Driver Version: 410.48 | >|-------------------------------+----------------------+----------------------+ >| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | >| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | >|===============================+======================+======================| >| 0 GeForce GTX 108... Off | 00000000:18:00.0 Off | N/A | >| 23% 25C P8 8W / 250W | 10MiB / 11178MiB | 0% Default | >+-------------------------------+----------------------+----------------------+ >... >+-----------------------------------------------------------------------------+ >| Processes: GPU Memory | >| GPU PID Type Process name Usage | >|=============================================================================| >| 1 329249 C python 1703MiB | >| 1 331339 C python 1703MiB |
Gls
PUの0番目が「GeForce GTX 1080 Ti」(
nvidia-smi -L
コマンドで一覧表示)でメモリ11178MiB中10MiBのみ使用されている.プロセスID(PID)329249がGPUの1番目を使用しててメモリは1703MiB使用
3.4. トラブルシューティング
3.4.1. 日本語が文字化けする時の対処法
以下を~/.bash_profile
に書き込む
# use Japanese, but output is English
export LC_CTYPE=ja_JP.UTF-8
export LANG=en_US.UTF-8
3.5. 使用Tips
3.5.1. .bash_profileと.bashrcの使い分け
- sshログイン時
.bash_profile
->.bashrc
の順に実行される - ログインしてる状況で新たにシェル(bash)が起動した際は
.bashrc
のみ実行
3.5.2. root権限がないサーバーでパッケージをソールビルドしてpargeで管理
結局使わなかったし動作確認したか覚えてないので,メモのみ残す.
ソフトをインストールするディレクトリを作成
通常は
/usr/bin
(管理者がyum
でインストールしたもの)もしくは/usr/local/bin
(管理者がコンパイルしてインストールしたもの)にインストールするがこのディレクトリはroot権限がないと書き込みできないので,個人用のソフトをインストールディレクトリ~/local/bin
を作成.(自分で決めてよいがコマンドは適宜読み替えが必要)mkdir -p ~/local/bin cd ~/local/bin
ソフト管理を行うporgeのインストール
ソースからコンパイルしてインストールしたソフトの管理を行うソフトporgeを最初にインストールする.
CentOSのバージョン確認
$g++ -v >COLLECT_GCC=g++ >COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/4.8.5/lto-wrapper
ここで,
/usr/libexec/gcc/x86_64_redhat-linux
が存在することを確認する.(以下x86_64_redhat-linux
は適当なものに読み替える)
~/local/bin
にパスを通す~/.bashrc
に以下を追記#~/local/binにパスを通す 2018/11/10 export PATH=$HOME/local/bin:$PATH
設定を反映させる
$sourch ~/.bashrc
porgeインストール
cd ~/local/bin wget http://sourceforge.net/projects/porg/files/porg-0.8.tar.gz tar xf porg-0.8.tar.gz cd porg-0.8 nice -n 19 ./configure --host=x86_64-redhat-linux --build=x86_64-redhat-linux --prefix=$HOME/local CFLAGS='-march=core2 -O3' --disable-grop --with-porg-logdir=$HOME/local/root/var/log/porg/ nice -n 19 make nice -n 19 make install nice -n 19 make logme