编程崽

登录

一叶在编程苦海沉沦的扁舟之上,我是那只激情自射的崽

Linux系统指令

Linux系统指令

下面是一个github开源项目,Linux命令大全搜索工具,内容包含Linux命令手册、详解、学习、搜集。

里面gh-pages分支是可以下载后直接双击打开可以使用的页面项目。

项目地址:https://github.com/jaywcjlove/linux-command

作者开放的浏览页面地址:https://wangchujiang.com/linux-command/

which、type 指令信息查看

which:从环境变量 PATH 中查找某个命令,并显示位置

  • a:将所有PATH目录中可以找到的命令均列出,而不仅仅是第一个
  • V:或者v,显示可执行文件的版本信息

type:用来显示指定命令的类型

  • t:显示指令类型
  • p:如果给出的指令为外部指令,则显示其绝对路径
  • a:在环境变量 PATH 指定的路径中,显示给定指令的信息,包括命令别名

不同指令类型的意义:

  • alias:别名
  • keyword:关键字,Shell保留字
  • function:函数,Shell函数
  • builtin:内建(内嵌)命令,Shell内建命令
  • file:文件,磁盘文件,外部命令
  • unfound:未找到

举例

sh 复制代码
# 查看 node
which -a node

# 输出
/root/.nvm/versions/node/v14.4.0/bin/node

# 查看一个指令的类型
type -t node

# 输出
file

# 查看一个指令全部路径
type -a node

# 输出
node is /root/.nvm/versions/node/v14.4.0/bin/node
node is /usr/bin/node

ps 查看某软件或工具的进程

常用指令组合

sh 复制代码
# 展示进程中的nginx相关进程
  ps -ef | grep nginx

# 输出
# UID   PID  PPID   C    STIME TTY        TIME    CMD
  501  2974     1   0  6:05下午 ??         0:00.00 nginx: master process nginx
  501  2975  2974   0  6:05下午 ??         0:00.00 nginx: worker process
  501 32619   796   0 10:48上午 ttys000    0:00.00 grep nginx

输入指令说明

  • -e:展示所有进程
  • -f:展示进程的更详细信息
  • |:linux的管道功能,会把|左侧输出的内容,传给|右侧的指令再处理加工
  • grep:linux的过滤指令,这里是过滤nginx

输出说明

  • UID:程序被该 UID 所拥有
  • PID:就是这个程序的 ID
  • PPID:则是其上级父程序的ID
  • C:CPU使用的资源百分比
  • STIME:系统启动时间
  • TTY:登入者的终端机位置
  • TIME:使用掉的CPU时间。
  • CMD:所下达的是什么指令

lsof 查看占用端口的进程们

sh 复制代码
# 查看8080端口占用情况
lsof -i :8080

# 输出
COMMAND   PID  USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
node    53177 majun   23u  IPv6 0x6e8e87fcf2e474b9      0t0  TCP *:samsung-unidex (LISTEN)

kill 杀死进程

需要提供要杀死进程的pid

sh 复制代码
# 杀死pid为1857的node服务
kill 1857

查看所有shell+当前shell+切换 shell

切换完成后,需要退出当前 shell 再重新打开,即可使用刚刚切换的 shell

sh 复制代码
# 查看当前所有支持的 shell
more /etc/shells
# 输出以下
/bin/bash
/bin/csh
/bin/dash
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zsh

# 查看当前使用的 shell
echo $SHELL
# 如果使用的是 zsh,则输出以下
/bin/zsh

# 切换shell,比如切换为 bash
chsh -s /bin/bash
# 之后重启终端,会发现使用的 shell 变成了 bash

终端 shell 的配置文件们

以下针对的都是 bash 这个 shell,但很多人平时使用的可能不是它,而是 zsh 或其他的 shell

所以把下面文件的文件名中的 bash 换成对应的 shell 就行,比如 /etc/bashrc 对应 /etc/zshrc

下面最常用的是 ~/.bash_profile 和 ~/.bashrc 两个文件,其他文件可能不同的 shell 会有不同。

  • /etc/profile:系统级,每个用户登录时都会读取。

  • /etc/bashrc:系统级,每个用户打开 bash shell 时,该文件都会被读取。

  • /etc/bash.bash_logout:系统级,每个用户退出登录是读取一次。

  • ~/.bash_profile:用户级,此用户登录系统时,读取一次(常用)。

  • ~/.bashrc:用户级,此用户打开 bash shell 时,该文件都会被读取。

  • ~/.bash_logout:用户级,此用户每次关闭 bash shell 或退出系统时,该文件读取一次。

注意,像系统级别的配置文件,和 ~/.bash_profile 这种只用户登录时才执行一次的配置文件,在用户使用过程中如果修改了这些文件,需要下次执行文件,文件的修改才会被应用。

如果像立即应用,需要在终端中使用 source 指令执行一下,比如修改 ~/.bash_profile 后,在终端执行:

sh 复制代码
source ~/.bash_profile

这样一来,就不需要用户重新登录,就能应用修改了。

此外,可以在其他 shell 的某一配置文件中,也可以添加这行代码,去引入其他 shell 的配置文件中的配置,比如:

sh 复制代码
# 在 ~/.bash_profile 中添加下面一行。
# 那么在每次执行 ~/.bash_profile 时,~/.zsh_profile 也会被执行。
source ~/.zsh_profile

全局环境变量的目录$PATH

安装的工具 git、node、brew等,我们可以打开终端直接使用,是因为系统设定了一些目录,这些目录下的脚本文件或软链接(快捷方式)都被自动添加到了全局,所以我们才可以在全局使用。

我们安装的那些工具,脚本文件或脚本文件的软链接(快捷方式),就放在系统的指定的那些目录下中的某一个。

这些目录就设置在 $PATH 这个全局变量中,可以在终端中打印这个变量,查看目录:

sh 复制代码
echo $PATH

# 输出
/Users/xiaoming/.avn/bin:/Users/xiaoming/.nvm/versions/node/v16.18.1/bin:/usr/local/bin:/usr/local/sbin:/usr/local/bin:/System/Cryptexes/App/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Applications/VMware Fusion.app/Contents/Public:/usr/local/go/bin

输出的字符串,使用 : 冒号分隔开,每一段就是一个文件夹,就是我们上面说的目录。

所以我们安装了新的工具,或者自己制作的脚本,想全局使用,有俩个办法。

方法一(推荐):把工具创建一个软链接,放在上面的目录中(一般新安装的工具,会自动添加)。

比如要把 /Users/xiaoming/myBin/set 的这个 set 指令做成全局的,要把他放到 /usr/local/bin 中:

sh 复制代码
ln -s /Users/xiaoming/myBin/set /usr/local/bin/set

设置完成后,就可以使用 set 这个全局指令了。

方法二:修改 $PATH 这个全局变量,把我们想添加的文件夹添加进去。

这样这个文件夹下的脚本,就变成全局可用的了。

比如我们存放脚本的文件夹是 /Users/xiaoming/myBin,具体操作就是在 shell 启动脚本中,比如 ~/.zshrc 中添加一下一行:

sh 复制代码
export PATH=$PATH:/usr/local/myBin

然后在输入以下并回车,让系统重新载入此文件,来使里面的修改生效:

sh 复制代码
source ~/.zshrc

ln 创建文件链接

格式:ln [参数][源文件或目录][即将要生成的链接]

链接分为软链接和硬链接,正常比较常用的是软链接,以下两个场景下很适合使用:

  • 安装软件,把软件指令创建到 bin 目录。
  • 某个文件夹位置比较难找,又经常需要进入。

软链接:

  • 软链接,以路径的形式存在,类似于Windows操作系统中的快捷方式。
  • 软链接可以 跨文件系统 ,硬链接不可以。
  • 软链接可以对一个不存在的文件名进行链接。
  • 软链接可以对目录进行链接。

硬链接:

  • 硬链接,以文件副本的形式存在。但不占用实际空间。
  • 不允许给目录创建硬链接
  • 硬链接只有在同一个文件系统中才能创建
参数 说明 例子:ln [参数] [源文件或目录] [即将要生成的链接]
创建硬链接 ln ~/less /usr/local/bin/less
-s 软链接(符号链接) ln -s ~/less /usr/local/bin/less
-b 删除,覆盖以前建立的链接
-d 允许超级用户制作目录的硬链接
-f 强制执行
-i 交互模式,文件存在则提示用户是否覆盖
-n 把符号链接视为一般目录
-v 显示详细的处理过程

netstat -ntulp 查看端口占用情况

**Mac系统中执行,需要把 -ntulp 换为 -nat **

sh 复制代码
# 查看所在端口的占用情况
netstat -ntulp

# 输出
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN      478/systemd-resolve 
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      606/sshd
# 以下省略
sh 复制代码
# 筛选出80端口的占用情况
netstat -ntulp | grep 80

# 输出
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      726/nginx: master p 
tcp6       0      0 :::8080                 :::*                    LISTEN      1054/java 

alias 给指令设置别名

使用一些封装过的SHELL的都知道,以列表的形式查看文件,指令为ll

但bash环境下使用ll会报错,只能使用ls -l

sh 复制代码
ll

# 输出
bash: ll: command not found

这时就可以使用Linux的给指令设置别名的功能。

sh 复制代码
# 在普通bash环境下

# 设置别名
alias ll='ls -l'

# 执行
ll

# 后面就会执行 ls -l

不过这样设置的话,当退出shell再重新打开,上面设置的别名就没有了。

如果想永久生效,需要写入到文件~/.bash_profile中,直接编辑此文件。

建议添加下面两个指令(如果他本来就有,可以修改他的)。

sh 复制代码
alias ll="ls -lhF"
alias la="ls -AlhF"

说明

  • -l:列表的形式展示
  • -h:列表中展示文件或文件夹所占空间的值,使用K/M/G的形式
  • -F:如果是文件夹类型,则最后加一个斜杠用来表示
  • -a:展示所有文件,主要包括隐藏文件
  • -A:同-a,但不列出 "." (目前目录) 及 ".." (父目录)

直接使用终端的vim修改的话,可能会出现各种提示各种阻止,无法修改,我的做法是把文件复制到桌面,使用编辑器修改后,再替换回去。

其他一些想要简化的命令,也是这样操作。

shutdown 关机/重启

参数

指令 说明
-t sec -t 后面加秒数,亦即『过几秒后关机』的意思
-k 不要真的关机,只是发送警告信息出去!
-r 在将系统的服务停掉之后就重新启动(常用)
-h 将系统的服务停掉后,立即关机。 (常用)
-n 不经过 init 程序,直接以 shutdown 的功能来关机
-f 关机并启动之后,强制略过 fsck 的磁盘检查
-F 系统重新启动之后,强制进行 fsck 的磁盘检查
-c 取消已经在进行的 shutdown 命令内容。

例子:

sh 复制代码
shutdown -h now
# 立刻关机

shutdown -h 20:25
# 系统在今天的 20:25 分会关机,若在21:25才下达此命令,则隔天才关机

shutdown -h +10
# 系统再过十分钟后自动关机

shutdown -r now
# 系统立刻重新启动

shutdown -r +30 'The system will reboot'
# 再过三十分钟系统会重新启动,并显示后面的信息给所有在在线的使用者

shutdown -k now 'This system will reboot'
# 仅发出警告信件的参数!系统并不会关机啦!吓唬人!

文件内容的宏观处理

  • 清空文件内容
sh 复制代码
cat a.txt
# 输出
aaaaaaaa

# 直接执行下面这个,会清空a.txt的内容
> a.txt
# 再cat a.txt时,什么也不会打印,因为a.txt的内容是空的
  • 覆盖文件的内容
sh 复制代码
cat a.txt
# 输出
aaaaaaa

cat b.txt
# 输出
bbbbbbb

# 把a.txt的内容,覆盖到b.txt中
cat a.txt > b.txt

# 查看b.txt的内容
cat b.txt

# 输出
aaaaaaa
  • 给文件的追加内容
sh 复制代码
cat a.txt
# 输出
aaaaaaa

cat b.txt
# 输出
bbbbbbb

# 把a.txt的内容,追加到b.txt中的最后面
cat a.txt >> b.txt

# 查看b.txt的内容
cat b.txt

# 输出
aaaaaaa
bbbbbbb

passwd 修改/设置密码

直接输入,回车。

如果没有设置过密码,会让设置密码,输入两次。

如果已经设置了密码,会让先输入旧密码,再输入两次新密码。

sh 复制代码
passwd

hostname 查看计算机名

sh 复制代码
hostname

# 输出
localhost

查看当前linux是什么系统,ubuntu还是别的

sh 复制代码
cat /etc/issue

# 输出
Ubuntu 18.04 LTS \n \l

uname 查看内核/操作系统/CPU信息

sh 复制代码
uname -a

# 输出
Linux localhost 4.19.81-perf-g453ac5d #1 SMP PREEMPT Tue May 19 03:00:27 CST 2020 aarch64 aarch64 aarch64 GNU/Linux

whoami: 查看当前用户名

sh 复制代码
whoami

# 输出
root

find: 查找文件

结构:find <path> -name '<name>'

paht: 查找的路径,查找当前目录下就是.或者./
name: 要查找的文件的名称,支持正则表达式

sh 复制代码
# 查找当前目录下(包含子目录),所有以'.js'结尾的文件和文件夹
find ./ -name '*.js'

# 输出
./.os/OS.js/node_modules/yaml/scalar.js
./.os/OS.js/node_modules/yaml/util.js
./.os/OS.js/node_modules/yaml/types.js
./temp.js

参数指定层级 -maxdepth

sh 复制代码
# 查找当前目录下(不含子目录),所有以'.js'结尾的文件和文件夹
find ./ -maxdepth 1 -name '*.js'

# 输出
./temp.js

ifconfig: 查看当前设备的ip

sh 复制代码
ifconfig

# 输出
Warning: cannot open /proc/net/dev (权限不够). Limited output.
lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  txqueuelen 1000  (UNSPEC)

rmnet_data1: flags=65<UP,RUNNING>  mtu 1410
        inet 10.98.126.154  netmask 255.255.255.252
        unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  txqueuelen 1000  (UNSPEC)

wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.1.8  netmask 255.255.255.0  broadcast 192.168.1.255
        unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  txqueuelen 3000  (UNSPEC)

id: 查看当前用户信息

sh 复制代码
id

# 输出
uid=0(root) gid=0(root) 组=0(root),3002,3003,9997,20318,50318,99909997

打印目录结构

使用 tree 指令,如果当前系统没有这个指令,可以使用系统软件安装工具来安装一下,比如 Mac 的 brew,Ubuntu 的 apt 等等。

或者,可以使用指令,直接打印,但这是使用系统自带命令组装出来的,可能不太美观。

sh 复制代码
find . -print | sed -e 's;[^/]*/;|__;g;s;__|; |;g'

free 查看内存使用情况

sh 复制代码
free -h

# 打印如下,应该不用又多余的说明

              total        used        free      shared  buff/cache   available
Mem:           1.9G        570M        862M        2.8M        560M        1.2G
Swap:            0B          0B          0B

top 实时查看系统信息

会全屏实时展示系统情况。

top 的具体参数意义参考:https://blog.csdn.net/qq_31666147/article/details/51557300

查看僵死程序,请阅读本文的 ps 的用法,有查找僵死程序和杀死的命令。

sh 复制代码
top

# 按 q 退出

# 全屏实时展示面板如下
top - 16:54:56 up 17 min,  1 user,  load average: 0.02, 0.32, 0.37
Tasks:  81 total,   3 running,  50 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.7 us,  0.7 sy,  0.0 ni, 98.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  2040912 total,   878644 free,   587860 used,   574408 buff/cache
KiB Swap:        0 total,        0 free,        0 used.  1303124 avail Mem 

  PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND                                                                                                                                   
  750 root      10 -10  140508  12360   9360 S  0.7  0.6   0:06.59 AliYunDun                                                                                                                                 
  644 root      20   0   33204   3152   2520 S  0.3  0.2   0:00.53 AliYunDunUpdate                                                                                                                           
 1054 root      20   0 2536000 251232  26940 S  0.3 12.3   1:43.32 java                                                                                                                                      
    1 root      20   0   77732   8760   6612 S  0.0  0.4   0:01.15 systemd                                                                                                                                   
    2 root      20   0       0      0      0 S  0.0  0.0   0:00.00 kthreadd                                                                                                                                  
    4 root       0 -20       0      0      0 I  0.0  0.0   0:00.00 kworker/0:0H                                                                                                                              
    6 root       0 -20       0      0      0 I  0.0  0.0   0:00.00 mm_percpu_wq                                                                                                                              
    7 root      20   0       0      0      0 S  0.0  0.0   0:00.15 ksoftirqd/0                                                                                                                               
    8 root      20   0       0      0      0 I  0.0  0.0   0:00.34 rcu_sched     

df、du 查看磁盘空间大小

df 和 du 相关命令:

  • df -hl:查看磁盘剩余空间
  • df -h:查看每个根路径的分区大小
  • du -sh [目录名]:返回该目录的大小
  • du -sm [文件夹]:返回该文件夹总M数
  • du -h [目录名]:查看指定文件夹下的所有文件大小(包含子文件夹)
sh 复制代码
# -h 选项为根据大小适当显示
df -h

Filesystem      Size  Used Avail Use% Mounted on
udev            975M     0  975M   0% /dev
tmpfs           200M  2.8M  197M   2% /run
/dev/vda1        40G  8.0G   30G  22% /
tmpfs           997M     0  997M   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           997M     0  997M   0% /sys/fs/cgroup
tmpfs           200M     0  200M   0% /run/user/0

显示内容参数说明:

  • Filesystem:文件系统
  • Size: 分区大小
  • Used: 已使用容量
  • Avail: 还可以使用的容量
  • Use%: 已用百分比
  • Mounted on: 挂载点
sh 复制代码
# 显示当前目录所占空间
du -sh

252M    .

其他非常常用的指令

cd: 进入文件夹

sh 复制代码
# eg: 进入dir文件夹
cd ./dir

ls: 罗列当前文件夹下所有非隐藏的文件和文件夹名字

sh 复制代码
ls

# 输出
Desktop    test
sh 复制代码
# 过滤显示以.js结尾的文件和文件夹
ll *.js

参数 -l 和 -h: 以「列表」的形式列出「带K/M/G形式占用的空间大小」详细信息

sh 复制代码
ls -l

# 输出
总用量 63K
drwx------.  2 root root 3.5K 5月  30 04:00 Desktop
-rwx------.  1 root root 9.2K 4月  11 15:43 test

参数 -al: 以列表的形式,列出包括隐藏文件和文件夹的详细信息

sh 复制代码
ls -al

# 输出
总用量 63K
drwx------.  2 root root 3.5K 5月  30 04:00 Desktop
-rwx------.  1 root root 9.2K 4月  11 15:43 test
drwx------.  2 root root 3.5K 5月  29 16:57 .vim

pwd: 显示当前所处的路径

sh 复制代码
pwd

# 输出
/root/Desktop

mkdir: 创建文件夹

sh 复制代码
# eg: 创建名为dir的文件夹
mkdir ./dir

mv: 移动和重命名

sh 复制代码
# eg: 把当前目录下的dir文件夹,移动到上级目录下
mv ./dir ../dir
sh 复制代码
# eg: 把当前目录下的dir更名为dir2
mv ./dir ./dir2

rm: 删除文件和文件夹

sh 复制代码
# eg: 删除文件 fileName.js
rm ./fileName.js
sh 复制代码
# eg: 删除文件夹 dir(添加参数 -r)
rm -r ./dir

date 查看当前系统时区和时间

sh 复制代码
date -R

# 输出值类似下面
# Wed, 03 Feb 2021 15:09:41 +0800