Linuxコマンド・bashの使い方実例

Linuxコマンド・bashの使い方の実例を紹介します。
管理人は某企業で、一応SEとして働かせていただいております(本業は組み込み系)。
まだまだ未熟者ですが、皆さんのお役に立てたら幸いです。

カテゴリ: Linuxコマンド

psコマンドの実行結果って、直感ではわからない項目があったりしますよね。。
この記事では、psコマンドの実行結果で、それぞれの列が何を意味しているのかをまとめます。
全てのプロセスを表示する、下記psコマンドの実行結果を対象に解説します(恐らく一番よく使うオプション指定だと思うので)。 

■全てのプロセスを表示するpsコマンド
ps -ely
ps axu ←BSD系OSの場合はこちら。その他のOSの場合はps -elyを使ってください(理由は、場合によっては異なる解釈でコマンドが実行されることがあるためです)。
 
psコマンド実行結果
見出し指定子意味
S、STATsプロセスの状態。D→I/O待ちのスリープ、R→実行中、S→イベントの完了を待っている割り込み可能なスリープ、T→シグナル等による停止、W→ページング、Z→ゾンビ
BSD系の場合、次のフラグが付加される <→優先度が高い、N→優先度が低い、L→ページ(メモリ)がロックされている(主にリアルタイムOS)、s→セッションリーダー、l→スレッド、+→フォアグラウンドプロセスグループ
UIDuidユーザID
USERuserユーザ名
PIDpidプロセスID
PPIDppid親プロセスのプロセスID
CcCPU使用率
PRIpri優先度。数値が高いほど優先度が低い。
NIninice値。-20〜19の値。優先度が低いと数値が高い
RSSrssスワップされていない、使用済みの物理メモリ量(kbyte)
SZsz使用している物理メモリ量
WCHANwchanスリープしているカーネルの関数名
TTYtname制御している端末
TIMEtimeプロセスが開始してからの累積CPU時間
CMDcmd実行コマンド
VSZvsz仮想メモリ量

表にある指定子は、ps -eo オプション指定時に使います。
ps -eoオプションを使うと、psコマンドの実行結果をカスタマイズでき、見たい情報だけを出力することができます(ps -elyで出力されない列も表示させることができる)。

例)ユーザIDと、プロセスIDと、親プロセスIDと、実行コマンドを出力したい場合。
ps -eo user,pid,ppid,cmd

今回の記事はここまでですが、
この他にもpsコマンドは沢山の情報を出力できますので、
もし興味があれば、man psでマニュアルを読んでみると良いと思います。

※なお、本記事はpsコマンドの以下バージョンに基づいています。
procps-ng version 3.3.9
 
スポンサードリンク
スポンサードリンク

ちょっとした小ワザ(ってほどでもないのですが・・)、
特定のディレクトリ、あるいはファイルの、特定の行のみ出力する方法を記載します。 
下記のsedコマンドで、指定したファイルの指定した行を出力できます。 

sed -n [行数]p [ファイル名]

※-nオプションは、条件に含まれない行は出力させないオプションです。
※カッコ[]は含めないでください。

ディレクトリに含まれるファイル全てを対象に出力する場合は、
以下のようにfindコマンドと組み合わせます。

find [ディレクトリ] -type f -exec sed -n [行数]p {} ¥;

特定の拡張子のファイルを対象にする場合(例では拡張子が.c)、
findコマンドに-name '*.c'などのオプションでフィルターをかけることもできます。

find [ディレクトリ] -type f -name '*.c' -exec sed -n [行数]p {} ¥;

このようにgrepやfindやsedを組み合わせて使い慣れることで、
作業効率を格段に上げることができます。
Linux環境を使う方には必須のテクニックでしょう。 

vimコマンドとGNU GLOBALというツールを組み合わせて、Linux環境でのエディタ環境を構築します。
GNU GLOBALと組み合わせると、関数ジャンプや関数呼び出し一覧表示やジャンプができるようになり、ソースコードの解析が早くなります。
また、Linux環境でのエディタの使い方を覚えることで、解析以外の作業の効率化にも繋がります。
例えば、Linux系OSのサーバにあるコードの解析をする時、わざわざWindowsのローカルマシンにソースをコピーして、グラフィカルなエディタで解析をしている場合、
サーバからソースをダウンロード・アップロードする手間・時間が省かれ、サーバ上でソースを編集してすぐ実行できるようになります。

この記事では、環境構築と、使い方をまとめます。

環境構築:
1. vimコマンドのインストール
2. GNU GLOBALのソースコードをダウンロード(https://www.gnu.org/software/global/
3. GNU GLOBALのソースコードをmake(configureしてmake)
4. 「3」でできたglobalとgtagsをホームディレクトリのbin(~/bin)にコピー(パスが通っている場所ならどこにコピーしても問題なし)
5. 「3」でできたgtags.vimを~/.vim/plugin(無いならディレクトリを作成)へコピー 

初期設定(.vimrc):
.vimrcの設定は以下にする(あくまで私の設定です。慣れたらカスタマイズしましょう)
*先頭の数字は行番号なので無視してください
  1 map <C-h> :Gtags -f %<CR> ←関数一覧表示
  2 map <C-j> :GtagsCursor<CR> ←関数定義へジャンプ
  3 map <C-n> :cn<CR> ←関数呼び出しなどの別ウィンドウのリストで下に移動するため
  4 map <C-p> :cp<CR> ←関数呼び出しなどの別ウィンドウのリストで上に移動するため
  5 map <C-g> :Gtags ←Gtagsコマンド入力を楽にするため(後述の:Gtagsの入力をCtrl + gに置き換えることができます)
  6 set number ←常に行番号を表示するため

コマンド使い方: 
vim + GNU GLOBALコマンド一覧
コマンド説明
gtags -v解析するソースのトップディレクトリで実行する。これをしないと関数ジャンプができない。なお、vimでのコマンドではなく、vimコマンド実行前の前準備。
Ctrl + j関数定義へジャンプ。定義で使うと呼び出し一覧表示
Ctrl + oジャンプ元へ戻る
Ctrl + iジャンプ元へ戻るを戻る
Ctrl + n関数一覧などの別ウィンドウのリストの下へ移動
Ctrl + p関数一覧などの別ウィンドウのリストの上へ移動
Ctrl + h現在のファイルの関数一覧
G最終行へジャンプ
yyカーソル行をコピー
pペースト
uアンドゥ
*カーソル位置の単語を下へ検索
#カーソル位置の単語を上へ検索
n次の候補へ移動
N前の候補へ移動
:数字数字の行数へジャンプ
:Gtags 関数名関数ジャンプ
:Gtags -r 関数名関数呼び出し一覧
:Gtags -g 文字列文字列をgrep

RaspberryPiやUbuntuなどのLinux環境において、スクリプトからメールを送信する方法を紹介します。
この方法では、postfixなどでMTAを構築せずとも、メールを送信することができます。

前提:
・ここで紹介する方法は、Ubuntu、Raspbianで確認しました。その他のOS、ディストリビューションで正しく動作するかは未確認です。
・メール受信の方法についてはここでは紹介しません。
・使用するSMTPサーバの認証方式によっては、ここで紹介する.mailrcの設定以外に、必要な項目がある可能性があります。ここでは楽天メールを使用した場合の一例に留めます。


mailxコマンドのインストール:
メールを送るために、mailxコマンドを使用します。
mailxコマンドを使うことで、MTAを構築せずに、直接SMTPサーバへメールを転送することができます。
以下のコマンドでmailxコマンドをインストールしてください。
sudo apt-get install heirloom-mailx
なお、既にインストールされているかどうかは、下記のコマンドで確認してください。
sudo dpkg -l | grep mailx
ii  heirloom-mailx                        12.5-4                                    armhf        feature-rich BSD mail(1)
上記のように、 heirloom-mailx が出力された場合は、インストール済みなので不要です。

.mailrcの作成:
 スクリプトを実行するユーザーのホームディレクトリ(~)に、.mailrcを作成します。
内容は下記の通りです。
vim ~/.mailrc ←エディタはviでもnanoでも何でも良いです。
  1 set smtp=smtp://mail.gol.com:587 ←送信元smtpサーバの指定(この例は楽天メールの場合です)
  2 set from=xxxxxxx@gol.com ←送信元メールアドレス
  3 set smtp-auth-user=xxxxxxxx@gol.com ←SMTP認証のユーザ名
  4 set smtp-auth-password="xxxxxxxx" ←SMTP認証のパスワード

これらの設定値は各メールサービスによって異なるので、利用するメールサービスごとに読み替えて設定してください。

メール送信:
ここまでで準備は完了したため、あとはメールを送るだけです。
以下のコマンドでメールを送信してください。
mailx -s "SUBJECT" xxxxxxxx@hotmail.co.jp < /home/hoge/msg.txt 

SUBJECTがメールの件名です。
xxxxxxxx@hotmail.co.jpが宛先メールアドレスです。
/home/hoge/msg.txtの中身が本文です。

本文をファイルから入力しない場合、以下のようにパイプで渡すこともできます。
echo "HONBUN" | mailx -s "SUBJECT" xxxxxxxx@hotmail.co.jp

また、件名、宛先、本文を指定しなければ、対話モードでメールを作成します。この時、件名、宛先を入力した後のEnterで何も表示されなければ、本文入力の開始です。本文の入力の終了はCtrl+Dを入力します。

スクリプトでメールを作成する場合は、本文をテキストファイルで出力しておいて、mailxコマンドの入力にすることが多いでしょう。この時、cronなどでmailxコマンドを実行する場合は、ファイルの入出力は絶対パスで指定しないと、相対パスで意図しないパスを見てファイル入出力が正しく行われなかったりするので、気をつけましょう。
 

grepコマンドで、テキストエディタ等でよくするgrep指定をする方法です。

コマンド書式:
grep -nr --include=読み込むファイル名 "検索文字列" 検索するディレクトリ

例) 
grep -nr --include=*.c "return 1" ./MyProject

解説:
例では、"return 1"という文字列を、カレントディレクトリにあるMyProjectフォルダ以下にある、拡張子が.cのファイルの中から検索します。結果に、マッチしたファイル名と行だけではなく、行番号も出力します。

結果例:
./MyProject/grep_test/greptest.c:1:return 1;

-nオプションで検索文字列が含まれるファイルの行番号を表示します
-rオプションで指定したディレクトリを再帰的に検索します
--include=オプションで検索対象とするファイルパターンを指定します。正規表現が可能です。複数パターンを指定する場合は--include=を複数指定します。 

なお、結果のファイル名や行番号はコロン「:」で区切られるため、awkなどで整形することも容易です。 

↑このページのトップヘ