常用linux命令
命令帮助:
man显示详细的系统手册页中的内容
man ls
使用/ -a来搜索关键词
help显示简要的 shell 命令
ls --help
info显示比man还详细的命令说明
info ls
查看进程id:
ps -ef | grep tomcat // 搜索进程
ps aux | grep tomcat
分别显示:
UID PID PPID C STIME TTY TIME CMD
root 18887 18828 0 08:09 pts/0 00:00:00 grep ApacheJetspeed
UID 程序被该user所拥有
PID 程序的 ID
PPID 上级父程序的ID
C CPU 使用的资源百分比
STIME 系统启动时间
TTY 登入者的终端机位置
TIME 使用掉的 CPU 时间。
CMD 所下达的指令为何
ps a 显示现行终端机下的所有程序,包括其他用户的程序。
ps -A 显示所有程序。
ps c 列出程序时,显示每个程序真正的指令名称,而不包含路径,参数或常驻服务的标示。
ps -e 此参数的效果和指定"A"参数相同。
ps e 列出程序时,显示每个程序所使用的环境变量。
ps f 用ASCII字符显示树状结构,表达程序间的相互关系。
ps -H 显示树状结构,表示程序间的相互关系。
ps -N 显示所有的程序,除了执行ps指令终端机下的程序之外。
ps s 采用程序信号的格式显示程序状况。
ps S 列出程序时,包括已中断的子程序资料。
ps -t<终端机编号> 指定终端机编号,并列出属于该终端机的程序的状况。
ps u 以用户为主的格式来显示程序状况。
ps x 显示所有程序,不以终端机来区分。
kill pid杀死进程 kill -9 pid
ps 9879 //根据进程id显示
pidstat -p 5472 //根据进程id显示
# 利用ps批量kill
ps aux|grep server|grep -v grep | awk '{print $2}'|xargs kill -9
查看文件被哪个进程占用:
lsof filename
lsof -p pid | grep log
查看进程启动路径
ls -l /proc/1062410 //1062410为进程pid
lsof神器
lsof -i :22 22端口信息
lsof -u daniel 用户打开文件信息
lsof -c syslog-ng 指定命令正在打开的文件和网络
lsof -p 10075 进程打开的文件
lsof /home/daniel/firewall_whitelist.txt 指定文件当前交互的进程
查看端口:
netstat -tupln | grep 4399 //根据进程id显示,也可搜索端口号
netstat -anp | grep 4399 //根据进程id显示
lsof -i:8080 //根据端口显示
查看当前文件夹下文件和文件夹:
find . -type d -maxdepth 1 显示当前目录下文件夹
ls –a 目前该目录下的所有文件及文件夹(包括隐藏文件)
ls –all 或 ls -l 目前该目录下的所有文件及文件夹(包括隐藏文件),而且还显示了每一个文件及文件夹的属性、所有者、创建时间、大小等等信息。
查看当前目录下文件夹大小:
sudo du -sh * | sort -n
查看文件大小:
ls -l --block-size=M
创建文件夹:
mkdir dirname
mkdir /home/dirname
mkdir -p train/dog #建多层文件夹
删除文件,夹:
rm -rf /home/dirname (r向下递归,f强制删除)
rm -rf /home/dirname/* (文件夹下所有文件)
修改文件,夹:
mv /home/dirname /home/anothername
mv /home/dirname/* /home/anothername
mv /home/dirname/a.html /home/anothername/b.html
修改文件夹名:
mv ./camera-openpose-keras-master ./keras
复制文件、文件夹:
cp -rf /home/dirname/* /home/anothername #dirname下所有文件
cp -R models …/caltech/models #将models文件夹及其以下文件复制
仅复制文件夹结构而不复制文件:
{}代表find查找到文件夹名,注意格式一定要正确
find . -type d -exec mkdir -p "../train/{}" \;
文件解压:
zip命令
解压:unzip FileName.zip -d files
压缩:zip -r FileName.zip DirName
tar命令
解包:tar zxvf FileName.tar
打包:tar czvf FileName.tar DirName
tar包压缩的时候用cvf参数,解压的时候用xvf参数
或压缩的时候用czvf参数,解压的时候用xzvf参数
不解压查看内部文件:
tar tvf my_file.tar.gz
Linux压缩保留源文件的方法:
gzip –c filename > filename.gz
Linux解压缩保留源文件的方法:
gunzip –c filename.gz > filename
1、*.tar 用 tar –xvf 解压
2、*.gz 用 gzip -d或者gunzip 解压
3、*.tar.gz和*.tgz 用 tar –xzf 解压
4、*.bz2 用 bzip2 -d或者用bunzip2 解压
5、*.tar.bz2用tar –xjf 解压
6、*.Z 用 uncompress 解压
7、*.tar.Z 用tar –xZf 解压
8、*.rar 用 unrar e filename解压
9、*.zip 用 unzip 解压
批量解压:
for tar in *.tar; do tar xvf $tar; done
合并文件解压:
cat part*.tar | tar -zxv
tar
-c: 建立压缩档案
-x:解压
-t:查看内容
-r:向压缩归档文件末尾追加文件
-u:更新原压缩包中的文件
这五个是独立的命令,压缩解压都要用到其中一个,可以和别的命令连用但只能用其中一个。
下面的参数是根据需要在压缩或解压档案时可选的。
-z:有gzip属性的
-j:有bz2属性的
-Z:有compress属性的
-v:显示所有过程
-O:将文件解开到标准输出
下面的参数-f是必须的
-f: 使用档案名字,切记,这个参数是最后一个参数,后面只能接档案名。
查找文件:
find /var -name tmp.txt
nohup后台 重定向:
nohup python app.py >/dev/null 2>&1 & (0、1和2分别表示标准输入、标准输出和标准错误信息输出)
查看ip:
外网:curl ifconfig.me
内网:ifconfig
一行执行多条命令:
a && b //a执行成功才执行b
a || b //a执行不成功才执行b
a ; b //a,b顺序执行
空间、内存、CPU使用
top cpu运行情况
df -m 以mb形式查看磁盘空间
free 查看内存使用情况
查看程序有几个版本:
都可以修改默认的版本
alternatives --config java
update-alternatives --display java
查看命令路径
which java // PATH路径中第一个JAVA的位置,也就是JAVA命令默认执行的位置
whereis java // 所有包含java(不管是文件还是文件夹)的路径都列了出来。
screen 后台的一种方式
建立screen:
screen
screen vi test.c
不中断程序,暂时断开会话,关闭ssh:
C-a d 即Ctrl键+a键,之后再按下d键
C-a ?来查看所有的键绑定
当前存在screen:
screen -ls
链接到已存在screen:
screen -r 16582 或者 自定义的name
如果shell突然断开而screen还是attached状态是时,使用
screen -D -r <session-id>
如果由于某种原因其中一个会话死掉了,使用screen -ls会显示该会话为dead状态。
使用screen -wipe命令清除该会话。
使用C-a A给窗口起名字。使用C-a w可以看到这些窗口名字。注意此处窗口指的是一个screen内部的多个tab。如果想为每个screen自定义name,从而避免每次找id的情况,可以使用
新建screen: screen -S name
或者对已存在screen使用: ctrl+a :sessionname 自定义name
再次登入时只能显示部分历史日志,此时可以进入选择模式来翻页查看:
Ctrl-a <Esc> 进入选择模式
<PageUp> 或 Ctrl-u 光标上移一页
<PageDown> 或 Ctrl-d 光标下移一页
<Left> 或 h 光标左移一格
<Down> 或 j 光标下移一行
<Up> 或 k 光标上移一行
<Right> 或 l 光标右移一格
<Space> 选择开始,选择结束
<Esc> 退出选择模式
Ctrl-a ] 粘贴选择的内容
更多命令
查看磁盘,文件夹大小:
df -h
du -h --max-depth=1
查看当前目录下每个子目录的文件数量
find . -maxdepth 1 -type d | while read dir; do count=$(find "$dir" -type f | wc -l); echo "$dir : $count"; done
显示当前绝对路径
pwd
查看添加环境变量:
查看
export
或
echo $PATH
查看所有设置的变量
set | grep nccl
永久添加(影响当前用户):
vim ~/.bashrc
export PATH="/data/anaconda3/bin:$PATH"
source ~/.bashrc
永久添加(影响所有用户):
vim /etc/profile
文档最后添加:
export PATH="/data/anaconda3/bin:$PATH"
source /etc/profile
必须source
暂时添加。终端关闭后失效
export PATH=/data/anaconda3/bin:$PATH
查找并统计文件数量:
f为普通文本,wc进行数量统计
find . -type f -name 'cat*' | wc -l # 12500
统计文件夹数量:
find . -type d -name 'ZJL*' | wc -l
find、grep、wc使用方法简单总结
Xargs用法详解(原创)
查找文件,随机选取,再移动到特定文件夹:
-n11250表示选取11250个文件,xargs -I file表示将每个文件名逐一赋值给file,然后执行mv file train/cat/
find . -name "cat*" -type f | shuf -n11250 | xargs -I file mv file train/cat/
find . -maxdepth 1 -type f -name 'cat*'| xargs -I file mv file val/cat/
添加linux用户
# 添加用户文件夹和用户名
sudo useradd -d /home/username -m username
sudo adduser username
# 添加用户登录bash环境
sudo vim /etc/passwd 用户后加:/bin/bash
修改(初始化)密码:sudo passwd name
删除用户:sudo userdel name
提高用户权限:sudo vim /etc/sudoers
查看所有用户:cat /etc/passwd
一句命令行将用户添加sudo权限:sudo adduser <username> sudo(下次登陆才生效)
kill用户所有进程
killall --user name1
pkill -u username
批量修改文件后缀:
awk -F 表示将文件名使用"."拆分
find . -name '*.JPEG' | awk -F "." '{print $2}' | xargs -i -t mv ./{}.JPEG ./{}.jpeg
AWK:
awk是以文件的一行为处理单位的。awk每接收文件的一行,然后执行相应的命令,来处理文本。
详细
使用空格或者逗号分割每一行,$0表示整行,$1表示分割的第一个:
awk -F '[ ,]+' '{print $3" "$7}' test.txt
BEGIN、END提前、之后的操作
ll |awk 'BEGIN {size=0;} {size=size+$5;} END{print "[end]size is ",size}'
根据第一列是否为1,提取数据。默认空格分隔:
awk '$1==1{print $0}' tr.libsvm4 > tr_pos
修改文件夹,文件权限,linux的-bash: ./xx: Permission denied:
权限说明
修改读写权限:
chmod 777 xx.sh
chmod 777 olddata/ -R
查看文件权限:
ls -l filename
查看文件夹权限:
ls -ld directoy
文件所属用户组:chgrp -R user smb.conf 或 chgrp username username/
文件所属拥有者:chown -R root /etc/config.cfg 或 chown username username/
chown -R root:root /home #-R递归文件夹子文件夹,root:root用户组,用户名
查看文件占用者:
#备注: 如果命令是在普通用户下开启,是没有结果的,需切换管理员权限
fuser xxx
fuser -km /datatmp
逐行读取文件路径,后复制文件:
awk对每行数据差分, $2==0过滤数据,注意如果你在windows编辑的map.sh,因为换行\r\n与unix下\n不同,会失败。需使用dos2unix转换一下。
cat map.sh | while read line; do awk -F "," '$2==0 {print $4}' | xargs -i cp ./images/{} ../test/{} ; done
两台linux的文件/文件夹传输:
上传:
scp /path/filename username@serverip:/path/
scp -r local_dir username@serverip:remote_dir
下载:
scp username@serverip:/path/filename /var/www/local_dir
scp -r username@serverip:/var/www/remote_dir/ /var/www/local_dir
清除GPU的内存占用:
查看哪些进程占用GPU
sudo fuser -v /dev/nvidia*
kill进程
kill -9 12345
2号 SIGINT:中断信号
9号 SIGKILL:杀死信号
11号 SIGSEGV:段错误信号
19号 SIGSTOP:暂停信号(如使用control + z操作)
18号 SIGCONT:继续信号(对应19号暂停信号)
搜索目录下所有文件中是否包含某字符串:
grep -r "test" /var/log/
CPU问题排查
top
iotop
sar
ps aux | grep 进程ID 来获取CPU与内存占用率
查看文件前几行并保存文件:
情景linux–一张图搞懂head -n和tail -n
head -n 10 /etc/profile
tail -n 5 /etc/profile
head -n 10 /etc/profile >>/home/save #保存文件
cat /home/save
cat filename | tail -n +3000 | head -n 1000 #从第3000行开始,显示1000行
cat filename| head -n 3000 | tail -n +1000 #显示1000行到3000行
sed -n '5,10p' filename #查看文件的第5行到第10行
less {文件}
/字符串 向下搜索“字符串”的功能
?字符串 向上搜索“字符串”的功能
n 重复前一个搜索(与 / 或 ? 有关)
N 反向重复前一个搜索(与 / 或 ? 有关)
b 向前翻一页
d 向后翻半页
q 退出 less 命令
空格键 向后翻一页
向上键 向上翻动一行
向下键 向下翻动一行
随机选取行数保存:
shuf -n 916891 te.libsvm > te.libsvm10
如果选取行数超过文件行数,使用r重复采样
shuf -r -n 15791434 tr_pos > samp_pos
CPU核数统计:
一个物理封装的CPU(通过physical id区分判断)可以有多个核(通过core id区分判断)。
而每个核可以有多个逻辑cpu(通过processor区分判断)。
一个核通过多个逻辑cpu实现这个核自己的超线程技术。
也就是一个物理核包含多个逻辑CPU
# 总核数 = 物理CPU个数 X 每颗物理CPU的核数
# 查看物理CPU个数
cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l
# 查看每个物理CPU中core的个数(即核数)
cat /proc/cpuinfo| grep "cpu cores"| uniq
# 总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数
# 查看逻辑CPU的个数
cat /proc/cpuinfo| grep "processor"| wc -l
查看CPU信息(型号)
cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c
查看内 存信息
cat /proc/meminfo
ubuntu查看安装软件:
# 查看安装
dpkg -l | grep docker
#删除软件
apt-get purge docker
sudo无法提升cd权限:
#默认缺省为获取root 用户
sudo su 或者sudo -sH
逐行比较文本差异:
diff file1 file2
合并文件:
将file1.txt和file2.txt合并到file.txt
cat file1.txt file2.txt > file.txt
将file1.txt追加到file2.txt的末尾
cat file1.txt >> file2.txt
随机从文件中固定行,分割文件
shuf可以随机从文件中提取多少行数据,但是要实现不重复分割就不行了。
# 首先打乱数据:
shuf train.txt > train_shuf.txt
# 再使用tail head分割:
head -n3079051 train_shuf.txt > va.libsvm0 #使用head提取3079051行
tail -n+3079052 train_shuf.txt > tr.libsvm0 # 使用tail提取剩余行数,注意+1
批量添加文件后缀:
将 abcd.jpg 重命名为 abcd_efg.jpg:
for var in *.jpg; do mv "$var" "${var%.jpg}_efg.jpg"; done
回收buffer、cache内存:
cat /proc/sys/vm/drop_caches #0
sync #强迫将未写入的缓存写入硬盘
echo 3 > /proc/sys/vm/drop_caches #改成3
cat /proc/sys/vm/drop_caches
free -h
linux查看占用内存最多的程序:
1.linux查看占用内存最多的程序
ps aux|head -1;ps aux|grep -v PID|sort -rn -k +4|head
2.查看占用cpu最多的程序
ps aux|head -1;ps aux|grep -v PID|sort -rn -k +3|head
挂载共享文件夹:
showmount --exports nas-server-IP 显示服务器上共享了那些目录。
mount nas-server-IP:share-dir your-local-dir 然后mount命令
查看当前用户安装的软件
comm -23 <(apt-mark showmanual | sort -u) \
<(gzip -dc /var/log/installer/initial-status.gz |
sed -n 's/^Package: //p' | sort -u)
删除文件夹中大量文件
Linux下删除大量文件
mkdir empty_dir
rsync -a --delete empty_dir/ yourdirectory/
cd yourdirectory
perl -e 'for(<*>){((stat)[9]<(unlink))}'
快速解压:
pigz -dc target.tar.gz | tar xf -
ctr-c ctr-z
ctr-c 终止程序
ctr-z 后台挂起程序,可使用fg重新启动
jobs -l 显示后台工作
kill %1 kill编号为1的后台工作
Ctrl+C - SIGINT
Ctrl+\ - SIGQUIT
Ctrl+Z - SIGTSTP
SIGINT
程序终止(interrupt)信号, 在用户键入INTR字符(通常是Ctrl-C)时发出,用于通知前台进程组终止进程。
SIGQUIT
和SIGINT类似, 但由QUIT字符(通常是Ctrl-)来控制. 进程在因收到SIGQUIT退出时会产生core文件, 在这个意义上类似于一个程序错误信号。
SIGTERM
程序结束(terminate)信号, 与SIGKILL不同的是该信号可以被阻塞和处理。通常用来要求程序自己正常退出,shell命令kill缺省产生这个信号。如果进程终止不了,我们才会尝试SIGKILL。
SIGSTOP
停止(stopped)进程的执行. 注意它和terminate以及interrupt的区别:该进程还未结束, 只是暂停执行. 本信号不能被阻塞, 处理或忽略
cd切换回上一操作所在路径
cd -
alias:
alias ll='ls -l'
ll /opt/cores/
core dump:
gdb调试常用实用命令和core dump文件的生成
# 启动
gdb7.12 /opt/cores/embedding_server.1565355483.2829246 /opt/cores/core.embedding_server.1565355483.2829246
# 列出程序崩溃时的堆栈信息
bt
# 退出
q
gdb EXEFILE COREFILE
#或
gdb -c | --core COREFILE EXEFILE
#或
gdb COREFILE
file EXEFILE