这篇文章总结了Linux笔记,以ubuntu20.04为例。
4. 文件操作命令
创建文件
touch file_name: 在当前文件夹中创建空文件touch path/file_name: 在指定路径创建文件
复制文件或目录
默认不会修改文件属性。
cp 选项 source dest: 默认带有-i参数,即覆盖时询问。\cp 选项 source dest: 如果有同名文件直接覆盖,不再询问。其中的“\”表示使用linux中的原生命令。
| 选项 | 描述 | 
|---|---|
-r | 
      recursive的简写,递归地复制文件夹 | 
-i | 
      覆盖时询问 | 
-u or --update | 
      Copy only when the source file is newer than the destination file or when the destination file is missing. | 
这是一个复制文件的辅助功能,用来显示复制的进度。
rsync compares file size and modification time and will skip copying if nothing has changed.
rsync -ah --progress source destination
四、系统管理
服务管理
ls /usr/sbin/ | grep service
执行系统服务的进程通常称为守护进程, 名称以”d”结尾的服务通常为系统服务。
- 基本语法: 
service service_name start | stop | restart | status - 查看服务: 
ls etc/init.d/service_name或者ls usr/lib/systemd/system systemctl start | stop | restart | status service_name.service结尾的服务文件,.target为一组服务的集合。- 所有系统服务的守护进程都是由
init.d进程启动的,init.d是linux内核初始化之后启动的第一个进程。 
运行级别(run level)
开机—>BIOS—>/boot(系统初始化)—>init进程—>判断运行级别—>根据运行级别启动对应的服务
| 运行级别 | 描述 | 
|---|---|
| 0 | 系统停机状态 | 
| 1 | 单用户,root权限,用于系统维护,禁止远程登录;类似Windows的安全模式;启动的服务最少,相当于最小化启动 | 
| 2 | 多用户,不支持网络,没有NFS(net file system) | 
| 3 | 多用户,登录后进入命令行模式 | 
| 4 | 未使用,保留 | 
| 5 | X11控制台,登录后进入图形GUI模式 | 
| 6 | 系统重启 | 
查看当前运行级别: systemctl get-default
进入对应级别: init 3(进入级别3)
配置开机服务
执行命令systemctl list-unit-files查看该服务是否开机自启。“static”表示该服务可能依赖于其它服务,无法确定是否启动。
关机重启
- 命令
    
- 执行shutdown之前会执行sync操作,把数据从内存同步到硬盘。为了性能,linux对硬盘预读和延迟写入,只有等缓冲区满了之后才会写到硬盘。
 - halt: 停机;停止CPU,但不断电,内存仍然工作。
 - power-off: 关机
 - reboot: 重启,等同于
shutdown -r now shutdown 选项 时间:
 - 选项
 
| 选项 | 功能 | 
|---|---|
| -H | 相当于--halt | 
    
| -r | =reboot | 
    
-P或者-h | 
      =power-off | 
now | 
      立刻关机 | 
时间 | 
      等待一定时间后关机(单位为分钟) | 
- 命令示例
 
| 命令 | 作用 | 
|---|---|
shutdown -c | 
      等待一定时间后关机,默认为1分钟 | 
shutdown 3 | 
      等待3分钟后关机 | 
shutdown 15:28 | 
      定时关机 | 
shutdown now | 
      立刻关机,但仍然会先执行sync操作 | 
environment variables
| variables | meaning | 
|---|---|
HISTSIZE | 
      Specifies the number of commands to keep in memory during a shell session. | 
HISTFILESIZE | 
      Specifies the maximum number of commands that can be saved in the history file. | 
五、常用命令
“Bourne+shell+Again=bash” ubuntu默认使用“dash”,也可以改为“bash”。“dash”不支持数组,其余和“bash”基本相同。
1. 帮助命令
1. man
主要描述
| 信息 | 功能 | 
|---|---|
| NAME | 命令名称和单行描述 | 
| SYNOPSIS | 怎样使用命令 | 
| DESCRIPTION | 详细描述 | 
| EXAMPLES | 例子 | 
使用
- 格式为
man [OPTION...] [SECTION]。 - 使用man查找一个命令,例如
man ls,man man。 - 内建命令(如cd,read,echo等都是shell内建命令), 都没有单独的man手册。可以通过命令
man bash-builtins查看,会出现所有的内建命令,命令按照首字符排序。内建命令随bash的加载和shell启动后即常驻系统内存。而其它命令需要从外部调用,相当于普通程序,称为外部命令。 - 使用
type判断命令是否为内建命令,例如type ls。 man --help cd,这种方式既可以查内建命令,也可用于外部命令。
2. 其它命令
- help: 
help cd查看命令,但只能用于内建命令 - info: 
info ls查看命令,只能用于外部命令。 alias:
2. 快捷键
| 快捷键 | 功能 | 
|---|---|
| ctrl+c | 停止当前程序 | 
| ctrl+l | 清屏,等同于clear | 
| 上下方向键 | 查找执行过的命令,也可修改执行过的命令 | 
| ctrl+z | |
| reset | 重启当前shell环境 | 
| tab键 | 自动补全 | 
5. 时间和日期
date
用法:date 选项 格式
| 参数 | 功能 | 
|---|---|
date | 
      当前时间 | 
+%Y | 
      当前年份 | 
+%y | 
      当前年份的后两位 | 
+%m | 
      当前月份 | 
+%d | 
      当前日 | 
+%M | 
      当前分钟 | 
+%S | 
      当前秒 | 
+%s | 
      当前秒数的时间戳 | 
+%Y-%m | 
      自定义输出格式 | 
"+%Y %m" | 
      如果有空格,必须用引号 | 
| 选项 | 功能 | 
|---|---|
| -d<时间字符串>时间字符串> | 显示指定的时间字符串表示的时间,不是当前时间 | 
date -d '1 days ago' | 
      显示前一天的时间 | 
date -d '1 days ago' | 
      显示明天的时间 | 
date -d '1 hours ago' | 
      |
| -s<日期时间>日期时间> | 设置系统时间 | 
date -s "2027-06-19 20:52:18" | 
      |
ntpdate 时间服务器 | 
      
cal
“calendar”的缩写。
| 选项 | 功能 | 
|---|---|
cal | 
      显示当前月 | 
cal -3 | 
      显示上月、本月、下月 | 
cal -m | 
      周一在首行 | 
cal 2021 | 
      显示2021年日历 | 
6. 用户权限
添加用户
| 命令 | 功能 | 
|---|---|
useradd 用户名 | 
      添加新用户 | 
useradd -g 组名 用户名 | 
      添加新用户到指定组 | 
useradd -d /data/dave tony  | 
      添加新用户tony并指定其home文件夹 | 
passwd 用户名 | 
      为用户设置密码 | 
id tony | 
      查找用户。“uid”为用户名,“gid”为组名 | 
cat /etc/passwd | 
      查看用户。大量默认用户用于运行系统服务,称为伪用户。自定义用户从“1000”开始。通过哪个进程与系统交互。 | 
su 用户名 | 
      “switch user”的缩写,切换到指定用户 | 
su root | 
      切换到root用户 | 
exit | 
      用户切换实际是会话的嵌套,这个命令会退回到上一用户 | 
who am i | 
      查看创建会话的用户的信息 | 
whoami | 
      查看当前用户名称 | 
sudo usermod -aG sudo username | 
      add user to sudo group so that user can use sudo | 
    
sudo usermod -d /new/home/path -m username | 
      
root
| 命令 | 功能 | 
|---|---|
sudo | 
      临时赋予root权限 | 
userdel tony | 
      删除用户“tony”。但该操作不能删除其home文件夹 | 
userdel -r tony | 
      删除用户“tony”,同时删除其home文件夹 | 
用户组
每个用户都有一个默认组,组名和用户名同名。一个组可以属于多个组。
| 命令 | 功能 | 
|---|---|
sudo cat /etc/group | 
      显示所有组 | 
groupadd 组名 | 
      |
usermod -g 组名1 | 
      把用户添加到指定组 | 
groupmod -n 组名2 | 
      修改组名 | 
groupdel 组名1 | 
      删除用户组 | 
文件属性
drwxr-xr-x  2 jpw jpw 131072 5月  30 21:29 business/ | 
    
| 文件属性 硬链接的数量/子文件夹的数量 属主 属组 文件大小 最后更改时间 文件名 | 
| 字符 | 描述 | 
|---|---|
| 首字符: 文件类型 | |
| c | 字符设备文件,例如鼠标键盘 | 
| b | block设备文件,例如硬盘 | 
| - | 普通文件 | 
| d | 文件夹 | 
| l | 链接文档 | 
| 1-3: 属主权限(Users) | |
| r | read | 
| w | write | 
| x | execute | 
| 4-6: 属组权限(Group) | |
| r | read | 
| w | write | 
| x | execute | 
| 7-9: 其它用户权限 | |
| r | read | 
| w | write | 
| x | execute | 
| 字符对文件和目录的含义 | |
| w | |
| 文件 | 可以修改文件,但不代表可以删除文件。有当前文件夹的写入权限才能删除文件。 | 
| 目录 | 在目录内可以创建、删除、重命名 | 
| r | |
| 文件 | 读取查看文件 | 
| 目录 | 可读取和查看目录内容 | 
| x | |
| 文件 | 可被系统执行 | 
| 目录 | 可进入该目录 | 
文件权限
chmod
| 属主 | 属组 | 其它用户 | 
| u | h | o | 
chmod {ugoa}{+-=}{rwx} 文件或目录 | 
      a表示全部; +为增加权限; -为撤销权限; 每个{}中选取一项组成参数 | 
chmod {mode}{mode}{mode} 文件或目录 | 
      4为r,2为写,1为执行,mode用一个数字表示权限(二进制编码) | 
chmod -R {mode}{mode}{mode} 文件或目录 | 
      4为r,2为写,1为执行,mode用一个数字表示权限(二进制编码);针对文件夹内的所有文件 | 
chown
| 命令 | 描述 | 
|---|---|
chown [option] 用户组:用户名 文件或目录 | 
      “change owner”的缩写 | 
-R | 
      递归操作 | 
If you try to change owner of file or directory stored in ntfs system(Windows), it’s possible to fail.
chgrp
| 命令 | 描述 | 
|---|---|
chgrp 最终用户组 文件或目录 | 
      “change group”的缩写 | 
新创建的不同用户不能使用tab补全,且不显示当前所在路径。解决方案点击此处. 原因是新创建的用户使用的shell为bin/sh,需要改为bin/bash。
10. 进程管理
启动之后一直存在、常驻内存的进程,称为“服务”。
ps
“process status”的缩写。
| 选项 | 描述 | 
|---|---|
ps | 
      显示的是当前用户和与当前终端相关联的进程 | 
ps aux \| grep xxx | 
      查看所有系统进程,可显示CPU和内存占用 | 
ps -ef \| grep xxx | 
      查看子父进程之间的关系 | 
-a | 
      列出带有终端的所有用户进程 | 
-x | 
      所有用户进程,包括没有终端的 | 
-u | 
      面向用户友好的显示风格 | 
-e | 
      列出所有进程 | 
-f | 
      显示完整格式的进程列表,可以显示PPID | 
ps aux结果分析
| item | meaning | 
|---|---|
| USER或UID | 调用进程的用户 | 
| VSZ | 虚拟内存。 LRU(less recently use)算法把不常用的内存会直接放到虚拟内存 | 
| RSS | 实际占用的物理内存 | 
| TTY | 。调用进程的终端。“?”表示后台的进程,没有对应的终端。“tty1”是图形化终端,tty2-6是本地的字符界面终端,pts/0-255表示虚拟终端 | 
| STAT | status.S睡眠状态,T暂停状态,Z僵尸状态(进程即将结束,但还有资源未清楚),s包含子进程,l多线程,+前台显示,<高优先级,N低优先级 | 
| START | 该进程的启动时间 | 
| TIME | 进程占用CPU的运算时间,不是系统时间 | 
| COMMAND | “[kthread]”所有内核线程的调用和管理 | 
| PPID | 父进程的ID | 
| STIME | 启动时间 | 
kill终止进程
基本语法:kill [选项] PID或者Kill 进程名
| 选项 | 描述 | 
|---|---|
-9 | 
      强行终止进程;活动的进程必须使用这个选项才能终止进程 | 
kill -l | 
      显示kill信号描述 | 
killall sshd | 
      关闭所有sshd进程 | 
进程树
使用命令pstree显示进程树,包含所有进程的父子关系
| 选项 | 描述 | 
|---|---|
-p | 
      显示进程的PID | 
-u | 
      显示进程所属用户 | 
进程监控
“top=table of process”:进程表
基本命令:top [选项]
| 结果 | 描述 | 
|---|---|
| cpu | |
us | 
      未经修改优先级的用户进程的占比 | 
sy | 
      系统进程 | 
ni | 
      nice的缩写该值越高,优先级越低 | 
wa | 
      wait的缩写,等待的时间占比,等待IO操作 | 
hi | 
      hardware interrupt缩写,硬件中断 | 
si | 
      software interrupt缩写,软件中断 | 
st | 
      steal的缩写,虚拟机占用 | 
| 进程 | |
PR | 
      priority缩写,系统任务调度的优先级 | 
NI | 
      用户指定的nice值 | 
VIRT | 
      virtual memory usage,虚拟内存 | 
RES | 
      resident memory usage,物理内存 | 
SHR | 
      共享内存 | 
| 命令 | 描述 | 
|---|---|
shift+m | 
      按内存占用排序 | 
shift+p | 
      按CPU占用排序 | 
shift+n | 
      进程号从大到小排序 | 
q | 
      退出top | 
u | 
      查看指定用户进程 | 
k | 
      kill指定进程 | 
| 选项 | 描述 | 
|---|---|
-d | 
      设定更新间隔,单位为秒 | 
-i | 
      不显示限制或者zombie进程 | 
-p | 
      指定PID监控指定进程 | 
网络
基本语法:
netstat -anp | grep PID:指定进程的网络信息
netstat -anp | grep 端口号:查看网络端口
| 选项 | 描述 | 
|---|---|
-a | 
      all的缩写 | 
-n | 
      不显示别名,例如,网址就是别名,使用这个选项直接显示IP | 
-l | 
      只列出在监听的服务状态 | 
-p | 
      显示调用的进程 | 
| 结果 | 描述 | 
|---|---|
Proto | 
      protocol缩写,协议 | 
Recv-Q | 
      已接收但没拷贝的字节数 | 
Send-Q | 
      已发送但对方未确认的字节数 | 
Local Address | 
      套接字,IP:port | 
    
11. 定时任务
cron
重启crond服务:systemctl restart cron
基本语法:crontab
| 选项 | 描述 | 
|---|---|
-e | 
      编辑定时任务 | 
-l | 
      列出所有定时任务 | 
-r | 
      清楚当前用户的所有定时任务 | 
时间的格式:共5个时间需要填,分别为分时天月周
| 符号 | 描述 | 
|---|---|
* | 
      不对这个时间作设置 | 
, | 
      多个时间并列 | 
2-5 | 
      表示时间范围,从2到5,单位取决于其所在的位置 | 
*/10 | 
      *表示对应的时间,每隔这个时间就执行一次,单位取决于其所在的位置 | 
# 分钟(0-59)、小时(0-23)、日(1-31)、月(1-12)、星期几(0-7,其中0和7都代表星期日)以及要执行的命令
* * * * * command-to-execute
use systemd to manage perdioc task
在/etc/systemd/system/目录下创建一个.service文件,如mytask.service。这个文件定义了要执行的任务。
[Unit]
Description=My custom task
[Service]
Type=oneshot
ExecStart=/path/to/your/script.sh
在相同目录下创建一个与服务文件同名但以.timer为后缀的文件,如mytask.timer。
[Unit]
Description=Runs my custom task
[Timer]
OnCalendar=*-*-* 12:00:00
Persistent=true
[Install]
WantedBy=timers.target
OnCalendar指定了任务运行的时间。上面的例子表示每天中午12点。
使用systemctl enable mytask.timer启用定时器,这样在系统启动时定时器也会自动启动。使用systemctl start mytask.timer立即启动定时器。使用systemctl list-timers查看所有定时器及其下一次触发时间。
九、文本处理工具
cut
cut [option] filename | 
      按照规则把文件的每行剪切为strings并输出 | 
-f 2,3,5-9,11- | 
      按列号提取 | 
-d " " | 
      按分隔符分割列,默认按照制表符\t(tab)分割 | 
    
-c | 
      按字符切割后加数字表示取第几列 | 
awk
基本用法:awk [option] '/[pattern]/{action}',其中“pattern”为正则匹配,“action”为执行的代码段
| 选项 | 描述 | 
|---|---|
-F | 
      指定输入文件分隔符 | 
-v | 
      使用一个用户定义的变量 | 
| 示例 | |
awk -F ":" 'BEGIN{action1}' 'END{action2}' | 
      在所有数据读取之前和之后执行的操作 | 
awk -v i=1 -F ":" '{print 3+i}' | 
      |
| 内置变量 | |
FILENAME | 
      包含路径的文件名 | 
NT | 
      列数 | 
NR | 
      行号 | 
其它
inode: 保存了文件的元信息,文件类型、文件权限、文件的链接数(硬链接的数量)、创建时间、文件索引编号等等。
硬链接指向的是文件的inode,因此只能针对文件,不能指向目录。当文件的硬链接数量为0时,说明该文件已经被删除。
登录桌面时的用户;图形化桌面环境也是root用户。
端口号:0-65535,默认使用,ssh用22,网页用80,mysql用3306
使用sudo ntpdate ntp.aliyun.com手动同步时间
run grep "#define BOOST_VERSION" /usr/include/boost/version.hpp to check out version of boost.
shortcut
customized shortcut can be stored in folder ~/.local/share/applications, such as ~/.local/share/applications/myapp.desktop.
pack deb
step
- set variables for dpkg: add lines below to 
.bashrc 
DEBEMAIL="email@moxa.com"
DEBFULLNAME="name family"
export DEBEMAIL DEBFULLNAME
- compile and install files into folder 
helloworld-1.0.0. tar -zcvf helloworld-1.0.0.tar.gz helloworld-1.0.0/cd helloworld-1.0.0- init dpkg
 
dh_make -f ../helloworld-1.0.0.tar.gz -n -s -y
# -s:Automatically set the package class to Single binary, skipping the question.
# -n:Create a native Debian packages
# -y:Automatic yes to prompts and run non-interactively. The package class needs to be set for dh_make to run fully automatically.
- 如果你的软件包需要那些标准的 
make install没有安装的文件, create fileinstall. - create deb file: 
dpkg-buildpackage -us -uc 
NOTE
- If you run the step5, and then you copy or move a file named 
installfromntfsfile system to folderdebian, you may get error like below 
debian/install: 1: assets/add.jpeg: Permission denied
QStandardPaths: wrong ownership on runtime directory /run/user/1000, 1000 instead of 0
bash
add cmake path
export PATH="$PATH:/path/to/your/folder"
add library path
export LD_LIBRARY_PATH="/path/to/your/libraries:$LD_LIBRARY_PATH"