20Linuxコマンドすべてのsysadminが知っておくべき

新しいツールと多様な開発環境であふれている世界では、開発者やエンジニアが基本的なsysadminコマンドを学 特定のコマンドとパッケージは、開発者がアプリケーションを整理、トラブルシューティング、および最適化するのに役立ち、問題が発生した場合には、

新しい開発者でも、独自のアプリケーションを管理したい場合でも、次の20の基本的なsysadminコマンドは、アプリケーションをよりよく理解するのに役立 また、アプリケーションがローカルでは動作するがリモートホストでは動作しない理由のトラブルシューティングにも役立ちます。 これらのコマンドは、Linux開発環境、コンテナ、仮想マシン(Vm)、およびベアメタルに適用されます。

curl

curlはURLを転送します。 アプリケーションのエンドポイントまたはアップストリームサービスエンドポイントへの接続をテストするには、このコマンドを使用します。 curlは、アプリケーションがデータベースなどの別のサービスに到達できるかどうかを判断したり、サービスが正常かどうかを確認したりするのに役立ちます。

例として、アプリケーションがMongoDBデータベースに到達できないことを示すHTTP500エラーをスローするとします:

$ curl -I -s myapplication:5000
HTTP/1.0 500 INTERNAL SERVER ERROR

-Iオプションはヘッダー情報を表示し、-sオプションは応答本文を沈黙させます。 ローカルデスクトップからのデータベースのエンドポイントの確認:

$ curl -I -s database:27017
HTTP/1.0 200 OK

では、何が問題になるのでしょうか? アプリケーションホストからデータベース以外の場所にアプリケーションが到達できるかどうかを確認します:

$ curl -I -s https://opensource.com
HTTP/1.1 200 OK

それは大丈夫そうです。 次に、アプリケーションホストからデータベースに到達してみてください。 アプリケーションはデータベースのホスト名を使用しているので、最初に試してみてください:

$ curl database:27017
curl: (6) Couldn't resolve host 'database'

これは、データベースのURLが使用できないか、ホスト(コンテナーまたはVM)にホスト名の解決に使用できるネームサーバーがないために、アプリケーションがデータベースを解決できないことを示します。

tool/jq

curlを発行した後、API呼び出しの出力が読みにくい場合があります。 場合によっては、特定のエントリを見つけるためにJSON出力をきれいに印刷したい場合があります。 Pythonにはこれを助けることができる組み込みのJSONライブラリがあります。 Python-m jsonを使用します。JSONをインデントして整理するためのツール。 PythonのJSONモジュールを使用するには、JSONファイルの出力をpython-m jsonにパイプします。ツールコマンド。

$ cat test.json
{"title":"Person","type":"object","properties":{"firstName":{"type":"string"},"lastName":{"type":"string"},"age":{"description":"Age in years","type":"integer","minimum":0}},"required":}

Pythonライブラリを使用するには、-m(module)オプションを指定して出力をPythonにパイプします。

$ cat test.json | python -m json.tool
{
"properties": {
"age": {
"description": "Age in years",
"minimum": 0,
"type": "integer"
},
"firstName": {
"type": "string"
},
"lastName": {
"type": "string"
}
},
"required": ,
"title": "Person",
"type": "object"
}

より高度なJSON解析のために、jqをインストールできます。 jqには、JSON入力から特定の値を抽出するオプションがいくつか用意されています。 上記のPythonモジュールのようにきれいに印刷するには、単に出力にjqを適用します。

$ cat test.json | jq
{
"title": "Person",
"type": "object",
"properties": {
"firstName": {
"type": "string"
},
"lastName": {
"type": "string"
},
"age": {
"description": "Age in years",
"type": "integer",
"minimum": 0
}
},
"required":
}

ls

lsディレクトリ内のファイルを一覧表示します。 システム管理者と開発者はこのコマンドを頻繁に発行します。 コンテナスペースでは、このコマンドはコンテナイメージのディレクトリとファイルを判別するのに役立ちます。 ファイルを検索するだけでなく、lsはあなたの権限を調べるのに役立ちます。 以下の例では、アクセス許可の問題のためにmyappを実行できません。 Ls-lを使用してアクセス許可を確認すると、アクセス許可には読み取りおよび書き込み専用の-rw-r–r–“x”が含まれていないことがわかります。

$ ./myapp
bash: ./myapp: Permission denied
$ ls -l myapp
-rw-r--r--. 1 root root 33 Jul 21 18:36 myapp

tail

tailファイルの最後の部分を表示します。 通常、トラブルシューティングのためにすべてのログ行は必要ありません。 代わりに、アプリケーションへの最新の要求についてログが何を言っているかを確認したいとします。 たとえば、Tailを使用して、Apache HTTPサーバーに要求を行ったときにログに何が起こるかを確認できます。

例)png

Tail-fを使用して、Apache HTTPサーバーのログを追跡し、要求が発生したときに確認します。

Tail-fを使用してApache HTTPログを追跡し、要求が発生したときに要求を確認します。

-fオプションは、ファイルに書き込まれたログ行を出力する”follow”オプションを示します。 この例には、数秒ごとにエンドポイントにアクセスするバックグラウンドスクリプトがあり、ログに要求が記録されます。 リアルタイムでログを追跡する代わりに、tailを使用して、ファイルの最後の100行を-nオプションで表示することもできます。

$ tail -n 100 /var/log/httpd/access_log

cat

catはファイルを連結して印刷します。 Catを発行して、依存関係ファイルの内容を確認したり、既にローカルでビルドしたアプリケーションのバージョンを確認したりすることができます。上記の例では、Python Flaskアプリケーションにflaskが依存関係としてリストされているかどうかを確認します。

grep

grepはファイルパターンを検索します。 別のコマンドの出力で特定のパターンを探している場合、grepは関連する行を強調表示します。 このコマンドは、ログファイル、特定のプロセスなどを検索する場合に使用します。 Apache Tomcatが起動するかどうかを確認したい場合は、行数に圧倒される可能性があります。 その出力をgrepコマンドにパイプすることで、サーバーの起動を示す行を分離します。

$ cat tomcat.log | grep org.apache.catalina.startup.Catalina.start
01-Jul-2017 18:03:47.542 INFO org.apache.catalina.startup.Catalina.start Server startup in 681 ms

ps

プロセスIdを調査するための便利なコマンドを提供するprocps-ngパッケージの一部であるpsコマンドは、実行中のプロセスの状態を示します。 このコマンドを使用して、実行中のアプリケーションを特定したり、予想されるプロセスを確認したりします。 たとえば、実行中のTomcat webサーバーを確認する場合は、psとそのオプションを使用してTomcatのプロセスIDを取得します。

$ ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 2 18:55 ? 00:00:02 /docker-java-home/jre/bi
root 59 0 0 18:55 pts/0 00:00:00 /bin/sh
root 75 59 0 18:57 pts/0 00:00:00 ps -ef

さらに読みやすくするには、psを使用してgrepにパイプします。

$ ps -ef | grep tomcat
root 1 0 1 18:55 ? 00:00:02 /docker-java-home/jre/bi

env

env環境変数を設定または出力することができます。 トラブルシューティング中に、間違った環境変数がアプリケーションの起動を妨げるかどうかを確認するのに役立 以下の例では、このコマンドは、アプリケーションのホストに設定された環境変数をチェックするために使用されます。

$ env
PYTHON_PIP_VERSION=9.0.1
HOME=/root
DB_NAME=test
PATH=/usr/local/bin:/usr/local/sbin
LANG=C.UTF-8
PYTHON_VERSION=3.4.6
PWD=/
DB_URI=mongodb://database:27017/test

アプリケーションがPythonを使用しており、MongoDBデータベースに接続するための環境変数があることに注意してください。

top

topソートされたプロセス情報を表示および更新します。 この監視ツールを使用して、どのプロセスが実行されているか、およびどのくらいのメモリとCPUを消費しているかを判断します。 一般的なケースは、アプリケーションを実行し、それが分後に死ぬときに発生します。 まず、メモリエラーであるアプリケーションの戻りエラーを確認します。

$ tail myapp.log
Traceback (most recent call last):
MemoryError

あなたのアプリケーションは本当にメモリ不足ですか? 確認するには、topを使用して、アプリケーションが消費するCPUとメモリの量を決定します。 Topを発行すると、ほとんどのCPUを使用しているPythonアプリケーションがメモリ使用量が上昇していることに気付き、それがアプリケーションであると思 実行中は、”C”キーを押して完全なコマンドを確認し、プロセスがアプリケーションである場合はリバースエンジニアリングします。 それはあなたの記憶集約的なアプリケーションであることが判明しました(memeater.pyアプリケーションのメモリが不足すると、システムはメモリ不足(OOM)エラーでそれを強制終了します。

例)png

すべてのメモリを消費するアプリケーションに対してtopを発行します。

アプリケーションのメモリとCPU使用率が増加し、最終的にはOOMが強制終了されます。

例)”を参照してください。png

topの実行中にCを押すと、完全なコマンドが表示されます

“C”キーを押すと、アプリケーションを起動した完全なコマンドが表示されます。

独自のアプリケーションのチェックに加えて、topを使用して、CPUまたはメモリを使用する他のプロセスをデバッグできます。

netstat

netstatはネットワークの状態を表示します。 このコマンドは、使用中のネットワークポートとその着信接続を表示します。 しかし、netstatはLinux上ではすぐには出てこない。 インストールする必要がある場合は、net-toolsパッケージで見つけることができます。 ローカルで実験したり、アプリケーションをホストにプッシュしたりする開発者は、ポートが既に割り当てられているか、アドレスが既に使用されている プロトコル、プロセス、およびポートオプションを指定してnetstatを使用すると、Apache HTTP serverが以下のホストで既にポート80を使用していることが示されます。

例)png

netstatはApacheがポート上で実行されていることを検証します80

netstat-tulpnを使用すると、Apacheはすでにこのマシンでポート80を使用していることが示されます。

ip

ipアドレスがホスト上で動作しない場合は、iproute2パッケージと共にインストールする必要があります。 サブコマンドのアドレス(略してip a)には、アプリケーションのホストのインターフェイスとIPアドレスが表示されます。 コンテナまたはホストのIPアドレスを確認するには、ipアドレスを使用します。 たとえば、コンテナが2つのネットワークに接続されている場合、ipアドレスはどのインターフェイスがどのネットワークに接続しているかを示すことができます。 簡単なチェックでは、いつでもip addressコマンドを使用してホストのIPアドレスを取得できます。 次の例は、web層コンテナのインターフェイスeth0上のIPアドレスが172.17.0.2であることを示しています。

$ ip address show eth0
3: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether d4:3b:04:9e:b2:c2 brd ff:ff:ff:ff:ff:ff
inet 10.1.1.3/27 brd 10.1.1.31 scope global dynamic noprefixroute eth0
valid_lft 52072sec preferred_lft 52072sec

lsof

lsofは、アプリケーションに関連付けられている開いているファイルを一覧表示します。 一部のLinuxマシンイメージでは、lsofパッケージを使用してlsofをインストールする必要があります。 Linuxでは、システムとのほとんどすべての対話はファイルのように扱われます。 その結果、アプリケーションがファイルに書き込むか、ネットワーク接続を開くと、lsofはその相互作用をファイルとして反映します。 Netstatと同様に、lsofを使用してlistenポートをチェックできます。 たとえば、ポート80が使用されているかどうかを確認する場合は、lsofを使用して、どのプロセスがポート80を使用しているかを確認します。 以下では、httpd(Apache)がポート80でリッスンしていることがわかります。 また、lsofを使用してhttpdのプロセスIDを確認し、webサーバーのバイナリがどこにあるかを調べることもできます(/usr/sbin/httpd)。

例)png

lsofはプロセス情報の起源を明らかにする

Lsofは、httpdがポート80でリッスンすることを示します。 HttpdのプロセスIDを調べると、httpdが実行するために必要なすべてのファイルも表示されます。

開いているファイルのリスト内の開いているファイルの名前は、プロセス、特にApacheの起源を特定するのに役立ちます。

df

df(空きディスク領域の表示)を使用して、ディスク領域の問題をトラブルシューティングできます。 コンテナオーケストレータでアプリケーションを実行すると、コンテナホスト上の空き領域が不足していることを示すエラーメッセージが表示される ディスク領域はsysadminで管理および最適化する必要がありますが、dfを使用してディレクトリ内の既存の領域を把握し、実際に領域が不足しているかど

$ df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 7.7G 0 7.7G 0% /dev
/dev/mapper/RHEL-Root 50G 16G 35G 31% /
/dev/nvme0n1p2 3.0G 246M 2.8G 9% /boot
/dev/mapper/RHEL-Home 100G 88G 13G 88% /home
/dev/nvme0n1p1 200M 9.4M 191M 5% /boot/efi
/dev/sdb1 114G 55G 54G 51% /run/media/tux/red

-hオプションは、人間が読める形式で情報を出力します。 デフォルトでは、この例のように、dfはルートディレクトリの下にあるすべての結果を提供しますが、コマンドの一部としてディレクトリを提供するこ

du

ディレクトリ内のディスク領域を使用するファイルに関する詳細情報を取得するには、duコマンドを使用します。 たとえば、どのログが/var/logディレクトリ内で最も多くのスペースを占めるかを知りたい場合は、duを-h(人間が読める)オプションと-sオプションで合計サイ

$ du -sh /var/log/*
1.8M /var/log/anaconda
384K /var/log/audit
4.0K /var/log/boot.log
0 /var/log/chrony
4.0K /var/log/cron
4.0K /var/log/maillog
64K /var/log/messages

上記の例では、/var/logの下にある最大のディレクトリが/var/log/auditであることがわかります。 Duをdfと組み合わせて使用すると、アプリケーションのホスト上のディスク領域を使用するものを判断できます。

id

アプリケーションを実行しているユーザーを確認するには、idコマンドを使用してユーザー idを返します。 以下の例では、Vagrantを使用してアプリケーションをテストし、その開発環境を分離します。 Vagrantボックスにログインした後、Apache HTTP Server(依存関係)をインストールしようとすると、システムはrootとしてコマンドを実行できないと述べています。 ユーザーとグループを確認するには、idコマンドを発行し、”vagrant”グループの”vagrant”ユーザーとして実行していることに注意してください。

$ dnf -y install httpd
Loaded plugins: fastestmirror
You need to be root to perform this command.
$ id
uid=1000(vagrant) gid=1000(vagrant) groups=1000(vagrant) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

これを修正するには、昇格された特権を提供するスーパーユーザーとしてコマンドを実行する必要があります。

chmod

ホスト上で初めてアプリケーションバイナリを実行すると、”許可が拒否されました。”Lsの例に見られるように、アプリケーションバイナリのアクセス許可を確認できます。

$ ls -l
total 4
-rw-rw-r--. 1 vagrant vagrant 34 Jul 11 02:17 test.sh

これは、バイナリを実行するための実行権限(”x”なし)がないことを示しています。 chmodは、ユーザーがバイナリを実行できるように権限を修正できます。

$ chmod +x test.sh
$ ls -l
total 4
-rwxrwxr-x. 1 vagrant vagrant 34 Jul 11 02:17 test.sh

この例に示すように、実行権限で権限が更新されます。 バイナリを実行しようとすると、アプリケーションは許可拒否エラーをスローしません。 Chmodは、バイナリをコンテナにロードするときにも便利です。 コンテナがバイナリを実行するための正しい権限を持っていることを保証します。

dig/nslookup

ドメインネームサーバー(DNS)は、URLをアプリケーションサーバーのセットに解決するのに役立ちます。 ただし、URLが解決されないことがあり、アプリケーションの接続の問題が発生することがあります。 たとえば、アプリケーションのホストからmydatabase URLでデータベースにアクセスしようとしたとします。 代わりに、”解決できません”エラーが表示されます。 トラブルシューティングするには、dig(DNS lookup utility)またはnslookup(Query Internet name servers)を使用して、アプリケーションがデータベースを解決できない理由を把握してみてください。

$ nslookup mydatabase
Server: 10.0.2.3
Address: 10.0.2.3#53
** server can't find mydatabase: NXDOMAIN

nslookupを使用すると、mydatabaseを解決できないことが示されます。 Digで解決しようとすると、同じ結果が得られます。

$ dig mydatabase
; <<>> DiG 9.9.4-RedHat-9.9.4-50.el7_3.1 <<>> mydatabase
;; global options: +cmd
;; connection timed out; no servers could be reached

これらのエラーは、さまざまな問題が原因で発生する可能性があります。 根本的な原因をデバッグできない場合は、sysadminに連絡して詳細を調査してください。 ローカルテストの場合、この問題はホストのネームサーバーが適切に構成されていないことを示している可能性があります。 これらのコマンドを使用するには、BIND Utilitiesパッケージをインストールする必要があります。

firewall-cmd

従来、ファイアウォールはiptablesコマンドでLinux上で設定されていましたが、その普遍性は維持されていますが、実際には主にnftablesに置き換えられています。 Nftablesのためのフレンドリーなフロントエンド、およびデフォルトで多くのディストリビューションに同梱されているものは、firewall-cmdです。 このコマンドは、コンピュータが許可する送信と受信の両方のネットワークトラフィックを管理するルールを設定するのに役立ちます。 これらのルールはゾーンにグループ化できるため、要件に応じて、あるルールセットから別のルールセットにすばやく簡単に移動できます。

コマンドの構文は簡単です。 コマンドといくつかのオプションを使用しますが、これらはすべて、人間が読める文をほとんど構築するのに役立つ方法で名前が付けられています。 たとえば、現在どのゾーンにいるかを確認するには:

$ sudo firewall-cmd --get-active-zones``
corp
interfaces: ens0
dmz
interfaces: ens1

この例では、コンピュータには2つのネットワークデバイスがあり、1つはcorpゾーンに割り当てられ、もう1つはdmzゾーンに割り当てられています。

各ゾーンが許可するものを確認するには、--list-allオプションを使用できます:

$ sudo firewall-cmd --zone corp --list-all
corp
target: default
interfaces: ens0
services: cockpit dhcpv6-client ssh
ports:
protocols:

サービスの追加も同様に簡単です:

$ sudo firewall-cmd --add-service http --permanent
$ sudo firewall-cmd --reload

firewall-cmdとの対話は直感的になるように設計されており、事前定義されたサービスの豊富なコレクションに加えて、nftルールを直接記述する機能があります。 Firewall-cmdの使用を開始したら、firewall-cmdチートシートをダウンロードして、最も重要なオプションを覚えておくことができます。

Sestatus

通常、SELinux(Linuxセキュリティモジュール)は、企業が管理するアプリケーションホスト上で強制されています。 SELinuxは、ホスト上で実行されているプロセスへの最小限の特権アクセスを提供し、悪意のあるプロセスがシステム上の重要なファイルにアクセスす 状況によっては、アプリケーションが特定のファイルにアクセスする必要がありますが、エラーがスローされることがあります。 SELinuxがアプリケーションをブロックするかどうかを確認するには、tailとgrepを使用して、/var/log/auditログで”拒否されました”メッセージを検索します。 それ以外の場合は、sestatusを使用して、ボックスにSELinuxが有効になっているかどうかを確認できます。

$ sestatus
SELinux status: enabled
SELinuxfs mount: /sys/fs/selinux
SELinux root directory: /etc/selinux
Loaded policy name: targeted
Current mode: enforcing
Mode from config file: enforcing
Policy MLS status: enabled
Policy deny_unknown status: allowed
Max kernel policy version: 28

上記の出力は、アプリケーションのホストがSELinuxを有効にしていることを示しています。 ローカルの開発環境では、SELinuxをより寛容に更新できます。 リモートホストのヘルプが必要な場合は、sysadminを使用して、アプリケーションが必要なファイルにアクセスできるようにするためのベストプラクティスを あなたが頻繁にSELinuxと対話している場合は、クイックリファレンスのための私たちのSELinuxチートシートをダ

history

テストやデバッグのために非常に多くのコマンドを発行すると、有用なコマンドを忘れることがあります! すべてのシェルには、historyコマンドの変種があります。 セッションの開始以降に発行したコマンドの履歴が表示されます。 履歴を使用して、アプリケーションのトラブルシューティングに使用したコマンドをログに記録できます。 たとえば、この記事の過程で履歴を発行すると、実験して学習したさまざまなコマンドが表示されます。

$ history
1 clear
2 df -h
3 du

以前の履歴でコマンドを実行したいが、再入力したくない場合はどうすればよいですか? 使って! 再実行するコマンド番号の前に。

例)png

履歴でコマンドを再実行する

追加! 実行するコマンド番号の前に、コマンドを再度発行します。

基本的なコマンドを使用すると、アプリケーションがある開発環境では動作するが、別の開発環境では動作しない理由を判断する際のトラ 多くのシステム管理者は、これらのコマンドを利用してシステムの問題をデバッグします。 これらの便利なトラブルシューティングコマンドのいくつかを理解することは、システム管理者と通信し、アプリケーシ

この記事はもともと2017年7月に公開されたもので、編集者によって更新されました。



+