普段の仕事のほとんどは Java 開発関連ですが、毎日 Linux システムを触ることになるので、特に Mac を使った後は、毎日黒い背景でコマンドライン環境で作業することになります。記憶力が良くなく、多くの便利な Linux コマンドはよく覚えていませんが、後で参照できるように徐々にまとめていきます。
基本操作
Linuxのシャットダウン、再起動
# 关机
shutdown -h now
# 重启
shutdown -r now
システム、CPU 情報の表示
# 查看系统内核信息
uname -a
# 查看系统内核版本
cat /proc/version
# 查看当前用户环境变量
env
cat /proc/cpuinfo
# 查看有几个逻辑cpu, 包括cpu型号
cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c
# 查看有几颗cpu,每颗分别是几核
cat /proc/cpuinfo | grep physical | uniq -c
# 查看当前CPU运行在32bit还是64bit模式下, 如果是运行在32bit下也不代表CPU不支持64bit
getconf LONG_BIT
# 结果大于0, 说明支持64bit计算. lm指long mode, 支持lm则是64bit
cat /proc/cpuinfo | grep flags | grep ' lm ' | wc -l
ソフトリンクを確立する
ln -s /usr/local/jdk1.8/ jdk
回転数関連
# 查看是否通过rpm安装了该软件
rpm -qa | grep 软件名
SSHキー
# 创建sshkey
ssh-keygen -t rsa -C [email protected]
#id_rsa.pub 的内容拷贝到要控制的服务器的 home/username/.ssh/authorized_keys 中,如果没有则新建(.ssh权限为700, authorized_keys权限为600)
コマンドの名前変更
# 在各个用户的.bash_profile中添加重命名配置
alias ll='ls -alF'
サーバー時刻を同期する
sudo ntpdate -u ntp.api.bz
バックグラウンドでのコマンドの実行
# 后台运行,并且有nohup.out输出
nohup xxx &
# 后台运行, 不输出任何日志
nohup xxx > /dev/null &
# 后台运行, 并将错误信息做标准输出到日志中
nohup xxx >out.log 2>&1 &
アクティブなユーザーを強制的にログアウトさせる
# 命令来完成强制活动用户退出.其中TTY表示终端名称
pkill -kill -t [TTY]
コマンドパスの表示
which <命令>
すべてのプロセスで開いている FDS の最大数を表示する
ulimit -n
DNSを設定する
vim /etc/resolv.conf
nslookup、ドメイン名ルーティング テーブルの表示
nslookup google.com
最後に、最近のログイン情報のリスト
# 最近登录的5个账号
last -n 5
固定IPを設定する
ifconfig em1 192.168.5.177 netmask 255.255.255.0
プロセスにロードされた環境変数を表示する
# 也可以去 cd /proc 目录下, 查看进程内存中加载的东西
ps eww -p XXXXX(进程号)
プロセス ツリーを表示してサーバー プロセスを見つけます
ps auwxf
プロセスの起動パスを表示する
cd /proc/xxx(进程号)
ls -all
# cwd对应的是启动路径
ユーザーを追加し、sudo 権限を設定する
# 新增用户
useradd 用户名
passwd 用户名
#增加sudo权限
vim /etc/sudoers
# 修改文件里面的
# root ALL=(ALL) ALL
# 用户名 ALL=(ALL) ALL
プロセス名にxxxが含まれるプロセスをすべて強制終了します。
ps aux|grep xxx | grep -v grep | awk '{print $2}' | xargs kill -9
ディスク、ファイル、ディレクトリ関連の操作
vim操作
#normal模式下 g表示全局, x表示查找的内容, y表示替换后的内容
:%s/x/y/g
#normal模式下
0 # 光标移到行首(数字0)
$ # 光标移至行尾
shift + g # 跳到文件最后
gg # 跳到文件头
# 显示行号
:set nu
# 去除行号
:set nonu
# 检索
/xxx(检索内容) # 从头检索, 按n查找下一个
?xxx(检索内容) # 从尾部检索
読み取り専用ファイルを開き、変更後に保存する必要がある(ユーザーを切り替えずに保存する方法)
# 在normal模式下
:w !sudo tee %
ディスク、ファイルディレクトリの基本情報を表示する
# 查看磁盘挂载情况
mount
# 查看磁盘分区信息
df
# 查看目录及子目录大小
du -H -h
# 查看当前目录下各个文件, 文件夹占了多少空间, 不会递归
du -sh *
トイレコマンド
# 查看文件里有多少行
wc -l filename
# 看文件里有多少个word
wc -w filename
# 文件里最长的那一行是多少个字
wc -L filename
# 统计字节数
wc -c
よく使用される圧縮および解凍コマンド
圧縮コマンド
tar czvf xxx.tar 压缩目录
zip -r xxx.zip 压缩目录
解凍コマンド
tar zxvf xxx.tar
# 解压到指定文件夹
tar zxvf xxx.tar -C /xxx/yyy/
unzip xxx.zip
ファイル所有者ユーザー、ユーザーグループを変更する
chown eagleye.eagleye xxx.log
cp、scp、mkdir
#复制
cp xxx.log
# 复制并强制覆盖同名文件
cp -f xxx.log
# 复制文件夹
cp -r xxx(源文件夹) yyy(目标文件夹)
# 远程复制
scp -P ssh端口 [email protected]:/home/username/xxx /home/xxx
# 级联创建目录
mkdir -p /xxx/yyy/zzz
# 批量创建文件夹, 会在test,main下都创建java, resources文件夹
mkdir -p src/{test,main}/{java,resources}
2 つのファイルを比較する
diff -u 1.txt 2.txt
パフォーマンステストとして使用できるログ出力のバイト数
# 如果做性能测试, 可以每执行一次, 往日志里面输出 “.” , 这样日志中的字节数就是实际的性能测试运行的次数, 还可以看见实时速率.
tail -f xxx.log | pv -bt
特殊文字を表示、削除する
# 查看特殊字符
cat -v xxx.sh
# 去除特殊字符
sed -i 's/^M//g’ env.sh 去除文件的特殊字符, 比如^M: 需要这样输入: ctrl+v+enter
システム上の理由により引き起こされるファイル内の特殊文字の問題への対処
# 可以转换为该系统下的文件格式
cat file.sh > file.sh_bak
# 先将file.sh中文件内容复制下来然后运行, 然后粘贴内容, 最后ctrl + d 保存退出
cat > file1.sh
# 在vim中通过如下设置文件编码和文件格式
:set fileencodings=utf-8 ,然后 w (存盘)一下即可转化为 utf8 格式,
:set fileformat=unix
# 在mac下使用dos2unix进行文件格式化
find . -name "*.sh" | xargs dos2unix
tee、リダイレクト中に画面に出力
awk ‘{print $0}’ xxx.log | tee test.log
検索関連
grep
# 反向匹配, 查找不包含xxx的内容
grep -v xxx
# 排除所有空行
grep -v '^/pre>
# 返回结果 2,则说明第二行是空行
grep -n “^$” 111.txt
# 查询以abc开头的行
grep -n “^abc” 111.txt
# 同时列出该词语出现在文章的第几行
grep 'xxx' -n xxx.log
# 计算一下该字串出现的次数
grep 'xxx' -c xxx.log
# 比对的时候,不计较大小写的不同
grep 'xxx' -i xxx.log
ああ
# 以':' 为分隔符,如果第五域有user则输出该行
awk -F ':' '{if ($5 ~ /user/) print $0}' /etc/passwd
# 统计单个文件中某个字符(串)(中文无效)出现的次数
awk -v RS='character' 'END {print --NR}' xxx.txt
find 検索コマンド
# 在目录下找后缀是.mysql的文件
find /home/eagleye -name '*.mysql' -print
# 会从 /usr 目录开始往下找,找最近3天之内存取过的文件。
find /usr -atime 3 –print
# 会从 /usr 目录开始往下找,找最近5天之内修改过的文件。
find /usr -ctime 5 –print
# 会从 /doc 目录开始往下找,找jacky 的、文件名开头是 j的文件。
find /doc -user jacky -name 'j*' –print
# 会从 /doc 目录开始往下找,找寻文件名是 ja 开头或者 ma开头的文件。
find /doc \( -name 'ja*' -o- -name 'ma*' \) –print
# 会从 /doc 目录开始往下找,找到凡是文件名结尾为 bak的文件,把它删除掉。-exec 选项是执行的意思,rm 是删除命令,{ } 表示文件名,“\;”是规定的命令结尾。
find /doc -name '*bak' -exec rm {} \;
ネットワーク関連
どのプロセスがポートを使用しているかを確認する
lsof -i:port
ローカルIPアドレスを取得する
/sbin/ifconfig -a|grep inet|grep -v 127.0.0.1|grep -v inet6|awk '{print $2}'|tr -d "addr:"
iptables
# 查看iptables状态
service iptables status
# 要封停一个ip
iptables -I INPUT -s ***.***.***.*** -j DROP
# 要解封一个IP,使用下面这条命令:
iptables -D INPUT -s ***.***.***.*** -j DROP
备注: 参数-I是表示Insert(添加),-D表示Delete(删除)。后面跟的是规则,INPUT表示入站,***.***.***.***表示要封停的IP,DROP表示放弃连接。
#开启9090端口的访问
/sbin/iptables -I INPUT -p tcp --dport 9090 -j ACCEPT
# 防火墙开启、关闭、重启
/etc/init.d/iptables status
/etc/init.d/iptables start
/etc/init.d/iptables stop
/etc/init.d/iptables restart
ncコマンド、tcpデバッグツール
#给某一个endpoint发送TCP请求,就将data的内容发送到对端
nc 192.168.0.11 8000 < data.txt
#nc可以当做服务器,监听某个端口号,把某一次请求的内容存储到received_data里
nc -l 8000 > received_data
#上边只监听一次,如果多次可以加上-k参数
nc -lk 8000
tcpdump
# dump出本机12301端口的tcp包
tcpdump -i em1 tcp port 12301 -s 1500 -w abc.pcap
ネットワークルーティングパスをトレースする
# traceroute默认使用udp方式, 如果是-I则改成icmp方式
traceroute -I www.163.com
# 从ttl第3跳跟踪
traceroute -M 3 www.163.com
# 加上端口跟踪
traceroute -p 8080 192.168.10.11
ss
# 显示本地打开的所有端口
ss -l
# 显示每个进程具体打开的socket
ss -pl
# 显示所有tcp socket
ss -t -a
# 显示所有的UDP Socekt
ss -u -a
# 显示所有已建立的SMTP连接
ss -o state established '( dport = :smtp or sport = :smtp )'
# 显示所有已建立的HTTP连接
ss -o state established '( dport = :http or sport = :http )'
找出所有连接X服务器的进程
ss -x src /tmp/.X11-unix/*
列出当前socket统计信息
ss -s
解释:netstat是遍历/proc下面每个PID目录,ss直接读/proc/net下面的统计信息。所以ss执行的时候消耗资源以及消耗的时间都比netstat少很多
ネット統計
# 输出每个ip的连接数,以及总的各个状态的连接数
netstat -n | awk '/^tcp/ {n=split($(NF-1),array,":");if(n<=2)++S[array[(1)]];else++S[array[(4)]];++s[$NF];++N} END {for(a in S){printf("%-20s %s\n", a, S[a]);++I}printf("%-20s %s\n","TOTAL_IP",I);for(a in s) printf("%-20s %s\n",a, s[a]);printf("%-20s %s\n","TOTAL_LINK",N);}'
# 统计所有连接状态,
# CLOSED:无连接是活动的或正在进行
# LISTEN:服务器在等待进入呼叫
# SYN_RECV:一个连接请求已经到达,等待确认
# SYN_SENT:应用已经开始,打开一个连接
# ESTABLISHED:正常数据传输状态
# FIN_WAIT1:应用说它已经完成
# FIN_WAIT2:另一边已同意释放
# ITMED_WAIT:等待所有分组死掉
# CLOSING:两边同时尝试关闭
# TIME_WAIT:主动关闭连接一端还没有等到另一端反馈期间的状态
# LAST_ACK:等待所有分组死掉
netstat -n | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key,"\t",state[key]}'
# 查找较多time_wait连接
netstat -n|grep TIME_WAIT|awk '{print $5}'|sort|uniq -c|sort -rn|head -n20
Linuxのパフォーマンスを監視するコマンド
上
按大写的 F 或 O 键,然后按 a-z 可以将进程按照相应的列进行排序, 然后回车。而大写的 R 键可以将当前的排序倒转
列名 | 意味 |
---|---|
PID | プロセスID |
PPID | 親プロセスID |
ロシア | 実際のユーザー名 |
UID | プロセス所有者のユーザーID |
ユーザー | プロセス所有者のユーザー名 |
グループ | プロセス所有者のグループ名 |
TTY | プロセスを開始した端末の名前。ターミナルから起動されていないプロセスは「?」と表示されます。 |
PR | 優先順位 |
の | 素敵な価値。負の値は優先度が高いことを示し、正の値は優先度が低いことを示します |
P | 最後に使用された CPU。マルチ CPU 環境でのみ意味があります。 |
%CPU | 前回の更新以降に占有された CPU 時間の割合 |
時間 | プロセスによって使用された合計 CPU 時間 (秒単位) |
時間+ | プロセスで使用された合計 CPU 時間 (単位は 1/100 秒) |
%MEM | プロセスによって使用される物理メモリの割合 |
仮想 | プロセスによって使用される仮想メモリの合計量 (kb 単位)。VIRT=SWAP+RES |
スワップ | プロセスによって使用される仮想メモリのスワップアウト サイズ (kb 単位)。 |
レス | プロセスによって使用され、スワップアウトされなかった物理メモリ サイズ (kb 単位)。RES=コード+データ |
コード | 実行可能コードが占有する物理メモリ サイズ (kb 単位) |
データ | 実行可能コード以外の部分(データセグメント+スタック)が占有する物理メモリサイズ(kb単位) |
SHR | 共有メモリのサイズ、単位はkb |
nFLT | ページフォールト |
NDRT | 前回の書き込み以降に変更されたページの数。 |
S | プロセスの状態。D=無中断スリープ状態、R=実行中、S=スリープ、T=トレース/停止、Z=ゾンビプロセス |
指図 | コマンド名/コマンドライン |
ウィチャン | プロセスがスリープ中の場合は、スリープ中のシステム関数名を表示します。 |
フラグ | タスクフラグ。sched.h を参照 |
dmesg、システムログの表示
dmesg
iostat、ディスクIOステータス監視
iostat -xz 1
# r/s, w/s, rkB/s, wkB/s:分别表示每秒读写次数和每秒读写数据量(千字节)。读写量过大,可能会引起性能问题。
# await:IO操作的平均等待时间,单位是毫秒。这是应用程序在和磁盘交互时,需要消耗的时间,包括IO等待和实际操作的耗时。如果这个数值过大,可能是硬件设备遇到了瓶颈或者出现故障。
# avgqu-sz:向设备发出的请求平均数量。如果这个数值大于1,可能是硬件设备已经饱和(部分前端硬件设备支持并行写入)。
# %util:设备利用率。这个数值表示设备的繁忙程度,经验值是如果超过60,可能会影响IO性能(可以参照IO操作平均等待时间)。如果到达100%,说明硬件设备已经饱和。
# 如果显示的是逻辑设备的数据,那么设备利用率不代表后端实际的硬件设备已经饱和。值得注意的是,即使IO性能不理想,也不一定意味这应用程序性能会不好,可以利用诸如预读取、写缓存等策略提升应用性能。
無料、メモリ使用量
free -m
eg:
total used free shared buffers cached
Mem: 1002 769 232 0 62 421
-/+ buffers/cache: 286 715
Swap: 1153 0 1153
第一部分Mem行:
total 内存总数: 1002M
used 已经使用的内存数: 769M
free 空闲的内存数: 232M
shared 当前已经废弃不用,总是0
buffers Buffer 缓存内存数: 62M
cached Page 缓存内存数:421M
关系:total(1002M) = used(769M) + free(232M)
第二部分(-/+ buffers/cache):
(-buffers/cache) used内存数:286M (指的第一部分Mem行中的used – buffers – cached)
(+buffers/cache) free内存数: 715M (指的第一部分Mem行中的free + buffers + cached)
可见-buffers/cache反映的是被程序实实在在吃掉的内存,而+buffers/cache反映的是可以挪用的内存总数.
第三部分是指交换分区
sar、ネットワーク スループット ステータスを確認する
# sar命令在这里可以查看网络设备的吞吐率。在排查性能问题时,可以通过网络设备的吞吐量,判断网络设备是否已经饱和
sar -n DEV 1
#
# sar命令在这里用于查看TCP连接状态,其中包括:
# active/s:每秒本地发起的TCP连接数,既通过connect调用创建的TCP连接;
# passive/s:每秒远程发起的TCP连接数,即通过accept调用创建的TCP连接;
# retrans/s:每秒TCP重传数量;
# TCP连接数可以用来判断性能问题是否由于建立了过多的连接,进一步可以判断是主动发起的连接,还是被动接受的连接。TCP重传可能是因为网络环境恶劣,或者服务器压力过大导致丢包
sar -n TCP,ETCP 1
vmstat、CPU 使用率、メモリ使用量、仮想メモリの相互作用、特定の時点での IO 読み取りおよび書き込みを監視します。
# 2表示每2秒采集一次状态信息, 1表示只采集一次(忽略既是一直采集)
vmstat 2 1
eg:
r b swpd free buff cache si so bi bo in cs us sy id wa
1 0 0 3499840 315836 3819660 0 0 0 1 2 0 0 0 100 0
0 0 0 3499584 315836 3819660 0 0 0 0 88 158 0 0 100 0
0 0 0 3499708 315836 3819660 0 0 0 2 86 162 0 0 100 0
0 0 0 3499708 315836 3819660 0 0 0 10 81 151 0 0 100 0
1 0 0 3499732 315836 3819660 0 0 0 2 83 154 0 0 100 0
-
r は実行中のキュー (つまり、CPU に実際に割り当てられているプロセスの数) を示します。テストしたサーバーには比較的アイドル状態の CPU があり、プログラムは実行されていません。この値が CPU の数を超えると、CPU ボトルネックが発生します。これはトップの負荷とも関係しており、一般的に負荷が3を超えると相対的に高くなり、5を超えると高くなり、10を超えると異常となり、サーバーの状態に影響されます。とても危険です。トップの負荷は、1 秒あたりの実行キューと同様です。実行キューが大きすぎる場合は、CPU が非常にビジーであることを意味し、一般に CPU 使用率が高くなります。
-
b はブロックされたプロセスを意味します。これについては多くは言いませんが、プロセスがブロックされていることは誰もが知っています。
-
swpd 仮想メモリの使用サイズ。0 より大きい場合、マシンの物理メモリが不足していることを意味します。それがプログラム メモリ リークの原因ではない場合は、メモリをアップグレードするか、メモリを移行する必要があります。他のマシンへのタスクの消費。
-
Free 空き物理メモリのサイズ。マシンの合計メモリは 8G、残りは 3415M です。
-
buff Linux/Unix システムは、ディレクトリ内の内容、権限のキャッシュなどを保存するために使用されます。私のローカル マシンは 300 M 以上を占有します。
-
キャッシュ キャッシュは、開いたファイルを記憶し、ファイルをバッファリングするために直接使用されます。私のマシンでは 300 M 以上を占有します (これは、空き物理メモリの一部をファイルとディレクトリのキャッシュとして使用する Linux/Unix の賢い機能です。 、プログラム実行のパフォーマンスを向上させるためです。プログラムがメモリを使用する場合、バッファ/キャッシュがすぐに使用されます。)
-
si は 1 秒あたりにディスクから仮想メモリのサイズを読み取ります。値が 0 より大きい場合は、物理メモリが不足しているかメモリリークが発生していることを意味し、メモリを消費しているプロセスを見つけて解決する必要があります。それ。私のマシンには十分なメモリがあり、すべてが正常に動作します。
-
so ディスクに書き込まれる 1 秒あたりの仮想メモリのサイズ (この値が 0 より大きい場合、上記と同じ)。
-
bi ブロック デバイスが 1 秒あたりに受信したブロックの数。ここでのブロック デバイスとは、システム上のすべてのディスクとその他のブロック デバイスを指します。デフォルトのブロック サイズは 1024 バイトです。このマシンでは IO 操作がないため、常に0 ですが、処理を行っています。大量のデータ (2 ~ 3T) をコピーするマシンでは、140000/s に達することが確認されており、ディスク書き込み速度は 1 秒あたりほぼ 140M です。
-
bo ブロック デバイスによって 1 秒あたりに送信されるブロックの数。たとえば、ファイルを読み取る場合、bo は 0 より大きくなければなりません。bi と bo は通常 0 に近く、それ以外の場合は IO の頻度が高すぎるため、調整する必要があります。
-
in 時間割り込みを含む、1 秒あたりの CPU 割り込みの数
-
cs 1 秒あたりのコンテキスト スイッチの数。たとえば、システム関数を呼び出すときは、コンテキスト スイッチング、スレッド スイッチング、プロセス コンテキスト スイッチングを実行する必要があります。値が小さいほど良いです。大きすぎる場合は、減らすことを検討してください。スレッドまたはプロセスの数、たとえば、Apache や nginx などの Web サーバーでは、パフォーマンス テストを行うときに通常、数千、さらには数万の同時テストを実行します。比較的小さい値では、プロセスとスレッドの数は次のようになります。より適切な値になります。同じことがシステム コールにも当てはまります。システム関数が呼び出されるたびに、コードがカーネル空間に入り、その結果コンテキストの切り替えが発生します。これは非常にリソースを大量に消費するため、システム関数を頻繁に呼び出すことは避ける必要があります。コンテキスト スイッチが多すぎると、CPU のほとんどがコンテキスト スイッチングに浪費され、その結果、CPU が重要な作業を行う時間が減り、CPU が完全に活用されなくなるため、お勧めできません。
-
us ユーザーの CPU 時間。サーバー上で暗号化と復号化を頻繁に行っていました。us が 100 に近く、r 実行キューが 80 に達していることがわかります (マシンはストレス テストを行っており、パフォーマンスは良好ではありません) )。
-
sy システム CPU 時間が高すぎる場合は、頻繁な IO 操作など、システム呼び出し時間が長いことを意味します。
-
id アイドル CPU 時間、一般的に言えば、id + us + sy = 100、一般的に id はアイドル CPU 使用率、us はユーザー CPU 使用率、sy はシステム CPU 使用率であると思います。
-
wt IO CPU 時間を待ちます。