文章目录
1. nohup
-
nohup的作用为忽略挂断信号,使得目标进程在session关闭后仍然可以继续运行。
-
如果我们的目标是要进程持续运行下去,那么首先我们要在末尾使用"&",将进程挂在后台运行。但是这样仍然不能保证程序会一直运行,原因是,当我们使用远程终端登入Linux时,会开启一个session,随后启动的所有进程都是这个session进程的子进程。当用户退出session时,session进程会关闭,同时所有子进程都会收到挂断信号,也会关闭。
-
因此,如果你想让你启动的进程不被关闭,就需要忽略挂断信号,这时就会使用到nohup命令了。
-
nohup使用示例
~$ nohup sh ./spark-submit.sh mainClass > spark.log 2>&1 &
其中,">"表示标准输出的重定向,"2>&1"表示将标准错误流重定向到标准输出里,
这样就会一并输出到spark.log文件中,通过这种方式启动的进程将不会受到终端断开的影响。
2. tar/zip/unzip
tar命令可以将多个文件或目录打成一个tar文件
# tar命令示例
# 打包压缩
~$ tar -zcvf dir.tgz dir/
# 上述命令表示将dir目录下面的文件和子目录,打包并使用gzip压缩为一个dir.tgz文件
# z表示使用gzip压缩,如果想使用bzip2压缩,可以将z替换为j;不想压缩可以去掉
# c表示压缩,建立新的归档文件
# v表示显示指令的执行过程,即都处理了哪些文件或目录
# f表示指定备份文件名
# 这里需要注意的是,dir/的路径尽量使用相对路径,不要使用绝对路径,否则很容易踩坑
# 解压文件
~$ tar -zxvf dir.tgz -C /tmp
# -x选项表示解压,从压缩状态还原为原始状态
# -C表示指定解压后的目录位置
zip命令也是打包,不同的是打出的是zip包,并且zip默认使用deflate算法进行压缩。常用形式如下所示:
# 打包
~$ zip -r dir.zip dir/
# -r表示递归处理,压缩的是目录时,此选项是必须的
# 这条命令会把dir目录及其下所有文件和子目录,压缩成dir.zip文件
# 解压
~$ unzip dir.zip
3. gzip/bzip/zcat/bzcat
gzip和bzip2常用于文件的压缩和解压
# gzip压缩
~$ gzip -v a.txt
# -v选项会打印出压缩的比例
# 命令执行后,源文件a.txt就不见了,会产生一个新文件a.txt.gz
# gzip解压
~$ gzip -dv a.txt.gz
# -d选项表示解压,由于有v选项,所以会打印出文件的压缩比
# 命令执行后,压缩文件a.txt.gz就不见了,但会多出一个源文件a.txt
# 查看gzip压缩文件的信息
~$ gzip -l a.txt.gz
# -l选项会展示压缩文件内部的文件列表及压缩比例
# bzip2压缩
~$ bzip2 -1 -k a.txt
# -1表示使用最小压缩比,压缩速度比较快(注意,这里是数字1不是字母l)
# -k表示保留源文件,如果去掉该选项将会和gzip命令一样,只有压缩后的文件,源文件会被删除
# bzip2解压
~$ bzip2 -d -k a.txt.bz2
# -d表示解压
# -k表示保留解压前的压缩文件
有时我们想要查看下压缩文件的内容,但是又不想去解压它,这时就要用到zcat和bzcat命令了,他们分别用于查看gzip压缩文件和bzip2压缩文件。使用示例如下:
# 查看gz文件
~$ zcat a.txt.gz
# 查看bz2文件
~$ bzcat a.txt.bz2
# 我们还可以配合管道查看hdfs上的压缩文件,例如:
~$ hdfs dfs -cat /data/a.txt.bz2 | bzcat
4. chmod/chown
chmod命令用于更改文件或目录的权限,而chown用于更改文件或目录的拥有者。
# chmod语法
chmod -R [ugoa][+-=][rwx] fileOrDir...
# -R选项表示递归处理所有子目录和文件
# u表示该文件的拥有者,g表示与该文件的拥有者属于同一组(group)的用户,o表示其他用户,a表示三者都包含。
# +表示增加权限,-表示取消权限,=表示唯一设定权限
# r表示可读取,w表示可写入,x表示可执行
# 还有一种写法是通过数字来标识权限,r用数字4表示,w用数字2表示,x用数字1表示,具体的权限就是三者之和,有这个权限就加上对应的数字,无这个权限则不加。例如
~$ chmod -R 755 b.sh
# 上述命令表示b.sh将要拥有的权限为rwxr-xr-x
# chown语法
chown -R user.group fileOrDir...
# 或者
chown -R user:group fileOrDir...
# 还有一种简写形式
chown -R user. fileOrDir...
# 上述命令会自动推断出user用户所在组
# -R选项表示递归处理所有子目录和文件
5. ifconfig/ip
这两个命令常用于查看本机的IP地址,有时在定位问题时会用到
~$ ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1454
inet 10.19.35.248 netmask 255.255.0.0 broadcast 10.19.255.255
# 输出结果的第二行inet后面就是本机IP,为减少篇幅占用,隐藏了部分输出结果
~$ ip addr
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1454 qdisc pfifo_fast state UP qlen 1000
link/ether 52:54:00:2d:2e:20 brd ff:ff:ff:ff:ff:ff
inet 10.19.35.248/16 brd 10.19.255.255 scope global eth0
valid_lft forever preferred_lft forever
# 输出结果中inet后面就是本机IP,为减少篇幅占用,隐藏了部分输出结果
6. df/du
df命令常用于查看磁盘使用情况,常用选项如下所示:
~$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/vda1 20G 12G 8.2G 60% /
devtmpfs 3.9G 0 3.9G 0% /dev
tmpfs 3.9G 0 3.9G 0% /dev/shm
tmpfs 3.9G 401M 3.5G 11% /run
tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup
/dev/vdb 200G 36G 165G 18% /data
tmpfs 783M 0 783M 0% /run/user/0
tmpfs 783M 0 783M 0% /run/user/1000
# -h选项表示以人类可读方式展示,而不是直接以字节数这种不直观的方式展示
du命令常用于显示目录或文件的总大小,常用选项组合如下所示:
~$ du -sch logs/ data/
1.8G logs/
868M data/
2.6G total
# -s选项表示只显示汇总摘要,不显示明细
# -c选项表示显示总和大小
# -h选项表示以人类可读方式显示
7. grep
grep命令用于过滤出符合条件的内容,该命令使用频率很高,且经常和其他命令搭配一起使用。
# 语法
grep [options] pattern fileOrDir...
其常用的选项如下表所示:
选项 作用
-c 计算符合匹配条件的行数
-A 后面跟数字N,表示除显示匹配上的行外,还显示其后面N行
-B 后面跟数字N,表示除显示匹配上的行外,还显示其前面N行
-C 后面跟数字N,表示除显示匹配上的行外,还显示其前后各N行;也可以简写成在中划线("-")后面直接跟数字。
-E 支持正则语法
-i 忽略字母的大小写
-o 只显示匹配上的内容
-R 表示递归遍历目标目录
# 使用示例
~$ grep -i datanode hdfs-site.xml
# 忽略大小写,查找包含datanode的行
~$ grep -20 -i error namenode.log
# 忽略大小写,查找namenode.log文件中包含error字样的前后20行内容
8. top/free
-
top命令常用于查看当前占用cpu或内存资源最高的进程。直接执行top,将显示按照cpu使用率降序排列的进程列表,在展示页面输入大写字母"M",可以按照内存使用率降序排列。通过top命令,我们可以获取到占用cpu或内存资源最高的进程的pid,之后可以通过ps命令(见下一节),查看具体是什么进程。
-
free命令常用来查看内存的使用情况。通常搭配-h选项使用,以人类可读的方式显示内存使用信息,如下所示:
~$ free -h
total used free shared buff/cache available
Mem: 188G 123G 14G 410M 50G 63G
Swap: 49G 39G 10G
# total列表示总内存大小,used是已使用内存大小,free表示未分配内存大小,available表示可使用内存大小
9. ps
-
ps命令常用于查找某个进程的详细信息,通常会配合grep一起使用。常用的选项组合为-ef或-aux,两个选项组合的差别不大,只是显示结果的方式略有不同,使用哪个都可以。
过滤出所有java进程
~$ ps -ef | grep java找出某个pid的详细信息
~$ ps -aux | grep 11543找出包含某个特定标识的进程
~$ ps -ef | grep -i datanode
10. jps
-
jps实际上并不是Linux命令,是java提供的用于查看java进程的命令,但是由于其使用频率很高,因此也在这里简单讲下。其常用方式如下:
~$ jps -lvm | grep -i zeppelin
# -l选项表示显示程序主类的长类名
# -v选项表示输出传递给JVM的参数
# -m选项表示输出传递给主类的参数 -
需要注意的是,jps命令只能查看当前用户下的java进程,如果要看所有用户的java进程,请使用ps命令配合grep,详见本文ps命令讲解的第一个示例。另外,只有配置了java环境变量(安装了java),才会有jps命令,否则是没有的。
11. ncftpgget/ncftpput
-
ncftpget命令常用于从ftp服务器下载文件,而对应的,ncftpput用于上传文件至ftp服务器,其常用方法如下:
# 上传本地文件至ftp服务器 ncftpput -z -uftpuser -p'ftppassword' -P21 ftp_ip ftp_dir/ local_file # -z选项表示使用断点续传功能 # -u选项后面跟登录ftp的用户名 # -p选项后面跟登录ftp的密码 # -P选项后面跟ftp服务器的端口号 # 后面的三个参数分别为ftp服务器的IP地址,要上传到ftp服务器的目标目录,要上传的本地文件名 # 下载ftp服务器上的文件到本地 ncftpget -z -uftpuser -p'ftppassword' -P21 ftp_ip loca_dir ftp_file # 和ncftpput命令相似,只是最后两个参数不同,local_dir表示要下载到本地的哪个目录下,ftp_file表示ftp服务器上的文件名称
12. crontab
Linux自带的非常强大的定时调度工具,非常的稳定。其常用的选项如下:
选项 作用
-e 编辑当前用户定时表,会默认使用内置的vi编辑器
-r 清空当前用户的定时表
-l 查看当前用户的定时表内容
crontab表达式的含义及写法,如下所示:这里需要重点关注的是,在键盘上字母e和字母r是挨着的,因此使用crontab命令时,千万不能手太快,要看清输入的是e还是r再按回车键,避免误操作把定时表给清空了。
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
如果你忘记了上述内容,没有关系,可以通过以下命令,查看到上面的解释:
~$ cat /etc/crontab
# 该命令输出的结果包含上述的表达式解释
# 这里我给出一个crontab的的具体示例
15 8,18 * * 1 /usr/bin/python /data/scripts/remove_expired.py > /dev/null 2>&1
# 上述crontab的含义为每周一的8点和18点的15分,执行一次后面的脚本,并忽略输出
13. su
su命令用于切换当前用户。其常见使用形式如下:
# 示例
~$ su spark
# 或者
~$ su - spark
上面两种方式的区别为,使用第二种方式时,不仅会切换用户而且还会切换当前工作目录到目标用户的home目录,shell环境也会一并切换。因此,强烈建议使用第二种形式,不然容易遇到各种坑爹的环境问题。
14. date
date命令用于获取系统的当前时间,可以配合格式化,获取你想要的时间形式。date命令的使用方法非常灵活,感兴趣的同学可以自行百度一下。我这里只举几个常用的例子:
# 获取今天的日期
~$ date '+%Y%m%d'
# 获取昨天的日期
~$ date -d '1 day ago' '+%Y-%m-%d'
# 针对指定日期进行加1天
~$ date -d '20190625 1 day' '+%Y%m%d'
# 第3条命令返回结果为20190626
15. wc
wc命令通常用于统计文件的行数、字数和字节数。比如,你要输出10000个选中的用户标识给业务方,在最后给出文件前,你可以使用这个命令验证下,是否刚好是10000行。其常用形式如下:
# 计算result.csv的行数
~$ wc -l result.csv
# 计算标准流内容的行数
~$ cat result.csv | wc -l
16. netstat/lsof
这两个命令都可以用于查看端口的监听情况,通常配合grep使用,其常用形式如下:
# 查看8080端口被哪个进程监听
~$ netstat -anlp | grep 8080 | grep LISTEN
# 或者
~$ lsof -i:8080 | grep LISTEN
# 如果没有输出结果,则说明无进程监听目标端口
# 查看8080端口上目前建立了多少个连接
~$ lsof -i:8080 | grep ESTABLISHED | wc -l
17. sh
shell命令,方便查看shell脚本的执行过程,常用于排查脚本问题。使用形式如下:
~$ sh -x submit.sh
# 将会输出运行过程中所有被执行的shell命令