基础命令

退出交互:Ctrl+C

文件授权

数字组规则
  • 读取权限:4
  • 写入权限:2
  • 执行权限:1
    要设置文件或目录的权限,可以将这些数字值相加来表示不同组用户(所有者、群组、其他用户)的权限。然后,将这些数字组合成一个三位数,其中:
  • 第一位数表示所有者的权限
  • 第二位数表示群组的权限
  • 第三位数表示其他用户的权限

授予所有用户读、写、执行权限,用于文件

chmod 777 filename/directory
  • 这将文件 filename 的权限设置为所有用户(所有者、群组和其他用户)都具有读取、写入和执行权限。
  • 这将目录 directory 的权限设置为所有用户都具有读取、写入和执行权限,以便他们可以在目录中执行任何操作。

如果想给文件设置所有者具有读取和写入权限,而群组和其他用户没有任何权限,可以使用以下命令(通常用于保护文件的隐私和安全性):

chmod 600 filename

这里的数字模式中:

  • 所有者权限为 6,因为读取权限(4)加上写入权限(2)等于 6。
  • 群组和其他用户的权限都为 0,因为它们没有任何权限。

编辑文件

vi/vim命令:vi是一种经典的文本编辑器,vim是vi的改进版本。它们都提供了丰富的编辑功能。

vi filename

在vi/vim中,可以使用以下命令进行保存和退出:

  • : 进入命令模式。
  • a 进入编辑模式。
  • wq 保存并退出。
  • !q 强制退出(如果文件已更改)。

查看文件

参数:
  • -f:实时追踪

要查看文件的内容,可以使用以下命令:

  1. cat:适用于小型文件,它将整个文件内容输出到终端。
cat filename
  1. less:适用于大型文件,它允许您按页查看文件内容,并允许在文件中进行搜索和浏览。
less filename

按下空格键向下翻页,按下 b 键向上翻页,按下 / 键进行搜索。

  1. more:类似于 less,用于逐页查看文件内容,但功能较少。
more filename

按下空格键向下翻页,按下 b 键向上翻页。

文件解压缩

Tip
  • 根据格式的含义再结合参数的含义,命令就出来了
  • zip用于跨平台传输,比如前端打包文件等文件夹很零碎先打包成zip再上传到服务器

解压缩原理

下面是关于常见的压缩格式以及相应解压缩参数的说明:

  1. tar 格式

    • 描述tar 是一种归档文件格式,用于将多个文件打包成一个文件,但不进行压缩。通常与其他压缩工具(如 gzip、bzip2)一起使用来创建压缩文件。
    • 解压缩参数
      • -x:解压缩操作。
      • -v:显示详细输出,列出解压缩的文件。
      • -f:指定要解压缩的文件。
  2. tar.gz 和 tar.bz2 格式

    • 描述:这两种格式是tar 打包后分别使用 gzip 和 bzip2 进行压缩的结果.tar.gz 格式也称为 .tgz.tar.bz2 格式也称为 .tbz2
    • 解压缩参数
      • -x:解压缩操作。
      • -v:显示详细输出,列出解压缩的文件。
      • -z(仅用于 .tar.gz):使用 gzip 解压缩。
      • -j(仅用于 .tar.bz2):使用 bzip2 解压缩。
      • -f:指定要解压缩的文件。
  3. zip 格式

    • 描述:zip 是一种流行的压缩格式,用于将多个文件和目录打包成一个文件,并进行压缩。它在 Windows 和跨平台环境中都有广泛的应用。
    • 解压缩参数
      • 无需指定参数,直接使用 unzip 命令解压缩文件即可。

这些是常见的压缩格式以及相应的解压缩参数。使用正确的参数可以确保正确地解压缩文件并恢复原始文件或目录。

解压命令

在Linux下,文件的解压缩可以使用以下常见命令:

  1. 解压缩 .tar 文件

    tar -xvf file.tar
    

    这会将 file.tar 解压缩到当前目录,并显示解压缩的过程。

  2. 解压缩 .tar.gz.tgz 文件

    tar -xzvf file.tar.gz
    

    或者:

    tar -xzvf file.tgz
    

    这会将 file.tar.gzfile.tgz 解压缩到当前目录,并显示解压缩的过程。-z 选项告诉 tar 使用 gzip 压缩算法。

  3. 解压缩 .tar.bz2 文件

    tar -xjvf file.tar.bz2
    

    这会将 file.tar.bz2 解压缩到当前目录,并显示解压缩的过程。-j 选项告诉 tar 使用 bzip2 压缩算法。

  4. 解压缩 .zip 文件

    unzip file.zip
    

    这会将 file.zip 解压缩到当前目录,并显示解压缩的过程。

打包压缩命令

tart打包压缩:

tar -cvf output.tar inputfile1 inputfile2 inputfile3 ...

这会将 inputfile1inputfile2inputfile3 等文件打包到名为 output.tar 的 tar 文件中。(目录同理)具体参数的含义如下:

  • -c:创建一个新的 tar 文件。
  • -v:显示详细信息,列出打包的文件。
  • -f:指定打包文件的名称。

要注意的是,打包文件时,不会对文件进行压缩,只是将文件集合到一个单独的 tar 文件中。如果需要对文件进行压缩,可以使用额外的压缩参数(如 -z-j)来在打包时进行压缩。

zip压缩:
要将目录打包成 zip 文件,可以使用 zip 命令。下面是打包目录为 zip 文件的基本语法:

zip -r output.zip directory/

这会将名为 directory 的目录及其所有内容递归地打包到名为 output.zip 的 zip 文件中。注意参数-r:递归地将目录及其内容添加到 zip 文件中。

目录操作

  • 打印当前目录:pwd
  • 查看目录命令:
    • ls:列出目录信息
    • ll:显示文件的详细列表,包括文件权限信息。
  • 创建路径&文件
    • mkdir -p /home/12306/logs
  • 切换:cd 路径
  • 移动:
    • 移动:mv source_directory destination_directory
    • 移动并重命名:mv source_directory /path/to/new_directory_name

进程查询

  • 查看端口占用:sudo lsof -i:3306
  • 使用 ps 命令查看当前正在运行的进程,看是否有 MySQL 相关的进程正在运行:ps aux | grep mysql
  • 杀进程:sudo kill <PID>

重定向输出

常用于日志写入文件,比如如果你想要实时监视日志并将其保存到文件中,你可以使用以下命令:

journalctl -u your-service-name.service -f > your-service-log.txt

这个命令将实时监视指定服务的日志,并将输出附加到指定的文件中,使其不断更新。

文件下载、拉取、上传

lrzsz

lrzsz 是一个在Linux命令行中使用的工具,它提供了一种简单的方式来通过串行线路上传(发送)和下载(接收)文件。这个工具包含了 rz(receive Zmodem)和 sz(send Zmodem)两个命令,它们分别用于接收和发送文件。
rz 命令允许您从本地计算机上传文件到远程Linux服务器,而 sz 命令则用于从远程服务器下载文件到本地计算机。
要使用 lrzsz,您首先需要在远程服务器上安装 lrzsz 包。在许多Linux发行版中,您可以使用包管理器来安装它。例如,在基于Debian的系统(如Ubuntu)上,您可以使用以下命令:

sudo apt-get install lrzsz

在安装了 lrzsz 之后,您可以通过SSH会话使用这些命令。以下是使用 rzsz 的示例:

  1. 上传文件到远程服务器:
    在本地计算机上打开一个SSH会话到远程服务器。然后,在SSH会话中运行 rz 命令。这将打开一个文件选择对话框,允许您选择要上传的文件。选择文件后,它们将被上传到远程服务器的当前目录。
    rz
    
  2. 从远程服务器下载文件:
    同样,在SSH会话中,您可以运行 sz 命令后面跟上您想要下载的文件名。这将提示您在本地计算机上选择一个目录来保存下载的文件。
    sz filename
    
    请注意,rzsz 命令需要在您的SSH客户端中正确配置,以便能够打开文件选择对话框。有些SSH客户端可能不支持这种交互式命令,或者可能需要额外的配置。如果您在使用 rzsz 时遇到问题,您可能需要尝试使用其他方法来上传或下载文件,如 scpsftp

curl

curl 是一个在命令行或脚本中向/从服务器传输数据的工具,支持许多协议,包括 HTTP、HTTPS、FTP、FTPS、SCP 等。curl 命令在 Linux、Windows、macOS 等操作系统中广泛可用,并且是许多开发者和服务工程师的常用工具。
以下是一些使用 curl 的基本示例:

  1. 下载文件:
    使用 curl 将远程文件下载到本地文件系统:
    curl -O https://example.com/file.txt
    
    这里,-O 选项告诉 curl 将下载的文件以远程文件的名称保存。您也可以使用 -o 选项后跟一个自定义的文件名。
  2. 上传文件:
    使用 curl 通过 HTTP POST 请求上传文件到服务器。这通常用于向 web 服务上传数据:
    curl -F "[email protected]" https://example.com/upload
    
    在这个例子中,-F 选项用于指定表单数据,[email protected] 表示表单中的一个名为 file 的字段,其内容来自本地的 localfile.txt 文件。
  3. 发送 JSON 数据:
    如果您需要向服务器发送 JSON 数据,可以使用 -H 选项来设置 Content-Type 头,并使用 -d 选项来提供 JSON 数据:
    curl -H "Content-Type: application/json" -d '{"key": "value"}' https://example.com/api
    
  4. 跟随重定向:
    默认情况下,curl 不会跟随 HTTP 重定向。如果您需要跟随重定向,可以使用 -L 选项:
    curl -L https://example.com/redirect
    
  5. 使用 HTTP Basic 认证:
    如果您需要向需要认证的服务发送请求,可以使用 -u 选项:
    curl -u username:password https://example.com/protected
    

系统服务

Tip

servicesystemctl 是两个用于管理系统服务的命令,它们在不同的 Linux init 系统中起作用。

  1. service 命令:

    • service 命令用于启动、停止、重新加载或查询系统服务的状态。
    • 在早期的 Linux 发行版中,如 CentOS 6、Ubuntu 14.04 以及其他使用 SysVinit 或 Upstart 的系统中,service 命令是管理系统服务的主要方式。
    • 例如,要重新加载 cron 服务,可以使用 service cron reload
  2. systemctl 命令:

    • systemctl 命令用于控制 Systemd 初始化系统中的服务。
    • 在较新的 Linux 发行版中,如 CentOS 7、Ubuntu 16.04 及更高版本,systemctl 已经成为管理系统服务的主要方式。
    • 例如,要重新加载 cron 服务,可以使用 systemctl reload cron

查阅系统服务

要查看Linux上所有正在运行的系统服务,以及哪些服务将在开机时自动启动,可以使用以下命令:

systemctl list-unit-files --type=service

这将列出所有已安装的服务以及它们的状态(启用或禁用),以及它们是否在启动时自动启动。 若要查看当前正在运行的服务,您可以运行:

systemctl list-units --type=service

查阅日志

对于使用 Systemd 创建的服务,你可以通过以下方式来查看服务的日志:

  1. 使用 journalctl 命令:

    journalctl -u index12306-aggregation.service
    

    这会显示出与 index12306-aggregation.service 相关的日志信息,包括启动、停止、重启以及服务输出的日志内容。

  2. 如果你想要查看最新的日志信息,可以使用 -f 参数:

    journalctl -u index12306-aggregation.service -f
    

    这会持续显示最新的日志信息,直到你按下 Ctrl + C 停止。

  3. 若要查看特定时间范围内的日志,可以使用 --since--until 参数:

    journalctl -u index12306-aggregation.service --since "2024-03-13 00:00:00" --until "2024-03-14 00:00:00"
    

    这会显示从指定时间范围内与 index12306-aggregation.service 相关的日志信息。

  4. 你也可以将日志输出到文件中以便稍后查看:

    journalctl -u index12306-aggregation.service > /path/to/logfile.txt
    

    将日志信息重定向到指定的文件中,方便日后查看。

启动系统服务

Tip

我们可以把所有启动任务都交给系统服务管理,服务单元结构文件如下:

  1. [Unit]:该部分包含服务单元的基本信息。

    • Description:描述服务的目的或功能。
    • After:指定服务应该在哪个目标之后启动。
  2. [Service]:该部分包含了配置服务的具体参数。

    • User:指定服务运行的用户。
    • WorkingDirectory:指定服务的工作目录。
    • ExecStart:指定服务的启动命令和参数。
    • StandardOutput:指定服务的标准输出文件路径。
    • StandardError:指定服务的标准错误输出文件路径。
    • Restart:配置服务在意外退出时的行为。
  3. [Install]:该部分包含了服务的安装相关信息。

    • WantedBy:指定服务所属的目标。
Warning
  • 对于由 systemd 管理的服务,日志通常由 journalctl 管理。
  • 你在服务单元文件中指定的日志输出到文件的方式可能不会生效,因为该服务的标准输出和标准错误输出可能已经被重定向到了 journalctl 中。
  • 如果你想输出到指定文件,在服务单元文件中使用 StandardOutputStandardError 选项指定日志输出到文件,而不是重定向到 journalctl。

对于启动 Gateway(Jar包) 的命令,也可以将其改造成一个 Systemd 服务单元文件,以便更加规范和方便地管理该服务。以下是改造步骤:

  1. 创建一个新的 Systemd 服务单元文件,比如 index12306-gateway.service

    sudo vi /etc/systemd/system/index12306-gateway.service
    
  2. 在该文件中输入以下内容:

    [Unit]
    Description=Index 12306 Aggregation Service
    After=network.target
    
    [Service]
    User=root
    WorkingDirectory=/home/12306
    ExecStart=/usr/local/java/zulu17.44.53-ca-jdk17.0.8.1-linux_x64/bin/java \
    -Xms1024m -Xmx1536m \
    -Dunique-name=-XXX \
    -Dframework.cache.redis.prefix=XXX: \
    -Dspring.data.redis.password=XXX \
    -Dspring.data.redis.port=XXX \
    -Dspring.data.redis.host=XXX \
    -Drocketmq.name-server=XXX \
    -Dspring.cloud.nacos.discovery.server-addr=XXX \
    -Dpay.alipay.notify-url=http://XXX:9000/api/pay-service/callback/alipay \
    -jar /home/12306/index12306-aggregation-service.jar
    StandardOutput=file:/home/12306/logs/index12306-gateway-service.log
    StandardError=file:/home/12306/logs/index12306-gateway-service.log
    Restart=always
    
    [Install]
    WantedBy=multi-user.target
    
  3. 保存并关闭文件。

  4. 重新加载 Systemd 管理器配置:

    sudo systemctl daemon-reload
    
  5. 启动你的服务:

    sudo systemctl start index12306-gateway.service
    
  6. 如果一切正常,设置开机自启动:

    sudo systemctl enable index12306-gateway.service
    

通过这种方式,你就可以使用 Systemd 来管理你的 Gateway 服务了,享受更好的管理和控制。

定时任务Crond

以定时清理内存为例

参考原文:云服务器定时清理内存怎么设置_mob649e815e258d的技术博客_51CTO博客
在云服务器上运行的应用程序通常会占用大量的内存资源,如果不及时清理内存,会导致服务器性能下降甚至崩溃。本项目方案旨在通过设置定时任务,定期清理云服务器的内存,提高服务器的稳定性和性能。
本项目将使用以下技术进行实现:

  • 服务器操作系统:Linux
  • 定时任务工具:cron
  • 编程语言:Shell脚本

确定清理内存的方法: 在Linux系统中,可以使用syncecho 1 > /proc/sys/vm/drop_caches等命令来清理内存。

Note
  1. 清空页缓存:写入1表示清空页面缓存。这将释放所有被内核缓存的文件系统上的页面缓存,但不清除已被使用的内存缓冲区(buffer)和目录项缓存(dentry cache)。
  2. 清空缓冲区:写入2表示清空内存缓冲区。这将释放所有被内核缓存的文件系统上的内存缓冲区,但不清除页缓存和目录项缓存。
  3. 清空目录项缓存和inode缓存:写入3表示清空目录项缓存和inode缓存。这将释放目录项缓存和inode缓存,但不清除页缓存和内存缓冲区。

编写清理内存的脚本: 首先,我们需要创建一个Shell脚本文件,用于执行清理内存的命令。创建一个名为clean_memory.sh的文件,并将以下代码复制到文件中:

#!/bin/bash 
# 清理内存 
echo 1 > /proc/sys/vm/drop_caches 
echo "Memory cleaned!"

设置定时任务:
使用cron工具可以方便地设置定时任务。我们可以编辑cron表达式来指定定时任务的执行时间。执行以下命令来编辑cron表达式:

crontab -e

在打开的编辑器中,添加以下一行,表示每天凌晨1点执行清理内存的脚本:

0 1 * * * /bin/bash /path/to/clean_memory.sh

请注意替换/path/to/clean_memory.sh为实际的脚本文件路径。

保存并退出编辑器。

启用定时任务:

Warning

通常情况下,Linux系统中使用的是 cron 服务来管理定时任务,但有些系统可能使用了其他的服务名,如 crond

定时任务的设置已经完成,我们需要重新加载cron服务以使其生效。执行以下命令来重新加载cron服务:

systemctl reload crond

至此,云服务器定时清理内存的设置已完成。
测试与验证:
为了验证定时任务是否正常工作,您可以手动执行一次清理内存的脚本来测试。执行以下命令来手动执行脚本:

/bin/bash /path/to/clean_memory.sh

如果一切正常,您将看到一条"Memory cleaned!"的输出。

内存监控htop

原生命令
  • free -h:这将以人类可读的方式显示内存占用情况
  • 使用top命令可以实时查看系统中各个进程的内存占用情况

虽然但是,Linux有一个非常强大的三方工具:htop-dev/htop:htop - 交互式进程查看器 --- htop-dev/htop: htop - an interactive process viewer (github.com)
怎么描述呢,就相当于Win系统任务管理器了!

安装

sudo apt install htop   # 如果你使用的是Debian/Ubuntu等系统 
sudo yum install htop   # 如果你使用的是CentOS/RHEL等系统 htop

界面组成

image.png

htop 使用不同的颜色来标识不同的进程和资源使用情况,以提供更直观的视觉表示。以下是 htop 中使用的一些颜色及其含义:

  • 正常颜色:大多数进程以正常颜色显示,表示资源使用在正常范围内。
  • 高亮颜色:某些特殊进程会以高亮颜色显示,以突出显示其重要性或特殊性。
  • 低亮颜色:部分进程以低亮颜色显示,表示它们是休眠或睡眠状态。
  • 加粗颜色:某些进程以加粗的形式显示,表示它们是当前活动进程。
  • 紫色:紫色表示内核线程,即在内核空间中运行的线程。
  • 蓝色:蓝色表示虚拟内存映射。
  • 绿色:绿色表示用户级别的任务。
  • 黄色:黄色表示系统级别的任务。
  • 红色:红色表示内核级别的任务。
  • 亮蓝色:亮蓝色表示 I/O 等待。
  • 亮绿色:亮绿色表示 CPU 等待。
  • 亮红色:亮红色表示虚拟内存交换。
  • 灰色:灰色表示线程。

请注意,颜色显示可能会因终端设置、主题或配置文件而有所不同。您可以根据自己的喜好和需求进行定制。如果您希望禁用颜色显示,可以在启动 htop 时使用 --no-color 参数。

表头含义:

  • PID – 描述进程的ID号
  • USER – 描述进程的所有者(谁跑的)
  • PRI – 描述Linux内核查看的进程优先级
  • NI – 描述由用户或root重置的进程优先级
  • VIR – 它描述进程正在使用的虚拟内存 (virtual memory)
  • RES – 描述进程正在消耗的物理内存(physical memory)
  • SHR – 描述进程正在使用的共享内存(shared memory)
  • S – 描述流程的当前状态 (state)
  • CPU% – 描述每个进程消耗的CPU百分比
  • MEM% – 描述每个进程消耗的内存百分比
  • TIME+ – 显示自流程开始执行以来的时间
  • Command –它与每个进程并行显示完整的命令执行 (比如/usr/lib/R)
    菜单快捷键:
  • F1: 查看htop的帮助文档,了解更多关于界面各项的详细信息。
  • F2: 进入设置菜单,可以进行一些全局设置,如排序方式、显示选项等。
  • F3: 在进程列表中进行搜索,输入关键字后会过滤显示匹配的进程。
  • F4: 进入筛选模式,可以按进程的特定属性进行过滤,如进程状态、用户等。
  • F5: 刷新界面,更新进程和系统资源的使用情况。
  • F6: 切换排序方式,按不同的列进行进程排序,如 CPU 使用率、内存占用等。
  • F7: 减少htop显示的进程列表,只显示部分进程。
  • F8: 增加htop显示的进程列表,显示更多进程。
  • F9: 发送信号给选定的进程,可以选择终止或发送其他信号。
  • F10: 退出htop命令,当然,按下键盘上的 q 键也可以顺利退出!!!

杀死进程

htop已经接近了任务管理器的功能了,可以通过鼠标点击 + 回车的方式,实现杀死进程,选择一个红色块内容后,点击F9,弹出红框,选择一个:9 SIGKILL

按下Enter是执行kill -9 XXXX。Esc是取消!

更换更好看的界面

干净的进程显示:

Tip

隐藏重复进程:将 Hide kernel threads 和 Hide userland process thread 选项选中,这样做可以隐藏内核线程和用户空间线程,使进程列表更加清晰。

使用 htop 的过程中会发现有很多同样的进程被标注了绿色大量显示。如下图所示。
image.png

这使得在大量程序运行时想要找到需要观察的进程变的困难。如何省略这些重复现实的进程呢?

  1. 输入 htop,显示出 htop 界面。
  2. 按下 F2 键,进入 Setup 模式
  3. 点击 Display options 选项,将 Hide kernel threads 和 Hide userland process thread 选中即可。
    image.png

更换配色:

启用Swap分区

内存不足时如何保持SSH打开

当服务器内存不足时,操作系统通常会使用 OOM Killer 杀死一些进程以释放内存。在某些情况下,这可能导致重要的进程被终止,例如 SSH 进程,从而导致服务器无法远程连接。为了避免这种情况,我们可以通过禁用 OOM Killer 来保护特定进程,例如 SSH 进程。

一种方法是使用 crontab 定时任务来定期禁用 OOM Killer。下面是实现这一目标的具体步骤:

  1. 编辑 crontab 文件:

    crontab -e
    
  2. 添加以下行到 crontab 文件中:

    */1 * * * * root pgrep -f "/usr/sbin/sshd" | while read PID; do echo -17 > /proc/$PID/oom_adj; done
    

    这个命令的含义是每分钟执行一次,并且会查找正在运行的名为 "/usr/sbin/sshd" 的进程,并为每个进程禁用 OOM Killer。

  3. 保存并退出 crontab 文件。

通过执行以上步骤,我们成功地设置了一个定时任务,该任务会每分钟执行一次,并禁用正在运行的 SSH 进程的 OOM Killer。这样,在服务器内存不足时,SSH 进程将不会被意外终止,确保了服务器的可远程连接性。