0%

Linux常用

不定时维护 Linux 常用命令

软连接

ln -s [源文件或目录]  [目标文件或目录]
ln -s /usr/local/php/bin/php /usr/bin/php

注意:第一个参数必须为绝对路径

重命名

mv now_name new_name

修改 root 密码

passwd root

添加快捷命令

alias site='cd /var/www/site/mycitsm/'

使用 yum 安装软件 sudo

yum -y install sudo
yum remove sudo

-y 忽略确认

删除目录

rm -rf dir

杀进程

ps -ef | more 分页看进程情况,如果知道进程名称 也可以用 ps -ef | grep 进程名称

kill -9 进程号

实时查看更新中的文件

tail -f file.log
tailf file.log

查找有 bom 头的文件

grep -r -I -l $'^\xEF\xBB\xBF' ./

然后用 notepad++去掉即可

查找文件

find ./ -maxdepth 1 -name "@*"

这个命令意思是,查找当前目录下以@开头的文件或者目录,搜索深度为一级也就是只在当前目录找,不进入子目录

查看硬盘是不是满了

查看磁盘剩余空间

df -hl

查看该目录的大小

du -sh /usr/local/*

查看软件安装位置

查看 git 位置:

whereis git

查看服务器端口通不通

telnet 60.194.65.154 3341

查看 linux 系统版本

uname -a
Linux qs-xezf-db2 2.6.18-194.el5 #1 SMP Tue Mar 16 21:52:39 EDT 2010 x86_64 x86_64 x86_64 GNU/Linux

centos 版本

cat /etc/redhat-release
CentOS release 5.4 (Final)
cat /etc/issue
CentOS release 6.8 (Final)

安装时指定安装目录

./configure --prefix=/usr/local/python3
make && make install

自启开机启动文件

/etc/rc.local

临时设置代理到本地

用来下载 github 文件

export all_proxy=socks5://192.168.2.133:1092

应用重启

centos6,service 命令依赖于 /etc/init.d/xxx

/etc/init.d/php-fpm restart
service php-fpm restart

centos7、Alibaba Cloud Liunx 2

systemctl restart php-fpm

应用开机自启

chkconfig

centos6 使用,串行启动需等待进程逐个启动

chkconfig nginx on/off
  • 必须存在 /etc/init.d/nginx 文件
  • 文件开头指定级别2345
#! /bin/sh
# chkconfig: 2345 55 25
# Description: Startup script for nginx webserver on Debian. Place in /etc/init.d and
  • chkconfig --add nginx 添加服务

systemctl

centos7 使用,多进程并发启动

systemctl enable nginx

实际是在 /etc/systemd/system/multi-user.target.wants/php-fpm.service 建立了/lib/systemd/system/php-fpm.service 的软链接

  • systemd 中的 service 如果开启了PrivateTmp=true 将创建它自己的/tmp子目录/tmp/systemd-private-*并相应地更改它的命名空间
  • systemctl 也会去/etc/init.d目录下查找
  • systemctl 也会去/lib/systemd/system 目录下查找
  • 修改后刷新 systemd,systemctl daemon-reload
  • status 中查看是否已设置开机启动

image.png

查看 redis 连接数

netstat -pan | grep 6379 | wc -l

查看 docker 容器中的 tcp 连接数

  • 查找 docker 容器进程号

docker inspect nginx | grep Pid

  • 进入某个进程的 network namespace

sudo nsenter -n -t 6692

  • 执行 netstat,此时只能查看当前 namespace 下的连接

netstat -pan | grep 443 | wc -l

变量操作

赋值

name="test"
echo $name
echo ${name}

等号周围不能有空格

定义默认值

name=${1:-"test"}

name 默认为$1,$1 未定义时为 test

只读

name="test"
readonly name
name="read"

使用 readonly 把变量变为只读变量,第二次赋值会报错

将命令的结果赋值给变量

name=`command`
name=$(command)

删除

unset name

读取文件收到的参数

server=$1

自定义的方法入参也是使用 $1

定义方法

get_ip() {
echo $1
return 0
}

get_ip liu.app
echo $?

函数的返回值必须为整数,用来标识方法是否执行成功,0 代表成功,非整数时会报 numeric argument required ,所以建议直接再方法中操作全局变量

局部变量

local name="test"
  • 脚本中定义的变量是 global 的
  • 函数定义的变量默认是 global 的,函数定义的变量可以被显式定义成 local 的,其作用域局限于函数内。

    函数的入参也是局部变量,仅限于函数内使用

添加 local/bin 到 PATH

默认情况下/sbin/ /usr/sbin/usr/local/sbin 不在普通用户的 $PATH 中,这些文件往往需要管理员权限,建议只在 root 用户的~/.bashrc中增加下列内容

export PATH=$PATH:/usr/local/sbin:/usr/local/bin
source ~/.bashrc

添加最新 epel(Extra Packages for Enterprise Linux)

centos7:

yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

centos8:

yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm

以指定用户执行命令

/sbin/nologin 用户执行指定命令

su www -s /bin/bash/ -c "git pull"
  • -s 指定 shell
  • -c 指定要执行的命令

bin sbin 区别

  • /bin 用于在/usr安装分区之前可用的二进制文件,用于在非常早期的引导阶段或在引导单用户模式下需要可用的简单二进制文件,如cat ls,适用于所有用户
  • /sbin 相上,需要拥有超级用户(root)权限的二进制文件
  • /usr/bin/bin,但适用于一般系统范围的二进制文件
  • /usr/sbin/usr/bin,需要拥有超级用户(root)权限的二进制文件
  • /usr/local/bin 本地程序的二进制文件
  • /usr/local/sbin 本地程序需要拥有超级用户(root)权限的二进制文件
  • root 的环境变量为:/sbin:/bin:/usr/sbin:/usr/bin

日期

  • 当前日期 date +%F 2022-01-29
  • 当前时间 date +"%F %H:%M:%S" 2022-01-29 10:59:07
  • 当月 date +%Y-%m 2022-01
  • 昨日 date -d yesterday +%F 2022-01-28
  • 上一个月 date -d "$(date +%Y%m)01 last month" +%Y%m 202112
  • 下一个月 date -d "$(date +%Y%m)01 next month" +%Y%m 202202

FreeBSD

  • 当前日期 date +%F 2022-01-29
  • 当前时间 date +"%F %H:%M:%S" 2022-01-29 10:59:07
  • 当月 date +%Y-%m 2022-01
  • 昨日 date -v-1d +%F 2022-01-28
  • 上一个月 date -v -1m -j "date +%Y%m010000" +%Y%m 202112
  • 下一个月 date -v +1m -j "date +%Y%m010000" +%Y%m 202202 注意:+号不能省略,-v 1m代表当前月
  • 详见:date

调试脚本

sh -x test.sh
记录调试脚本信息到日志

sh -x test.sh > /tmp/test.out 2>&1

文件系统

  • 目录项:包括文件名和 inode 节点号。
  • Inode:又称文件索引节点,包含文件的基础信息以及数据块的指针。
  • 数据块:包含文件的具体内容

数据块 block

  • 硬盘的最小存储单位叫做”扇区”(Sector),每个扇区储存 512 字节(相当于 0.5KB)
  • 为增加效率会一次性连续读取多个扇区,即一次性读取一个”块”(block),这种由多个扇区组成的”块”,是文件存取的最小单位。”块”的大小,最常见的是 4KB,即连续八个 sector 组成一个 block。
  • 文件数据都储存在”块”中

inode

  • 储存文件元信息的区域就叫做 inode,中文译名为”索引节点”
  • 当查看某个文件时,会先从 inode 表中查出文件属性及数据存放点,再从数据块中读取数据。
  • inode 也会消耗硬盘空间
  • 每个 inode 都有一个号码,操作系统用 inode 号码来识别不同的文件
  • 使用ls -i demo.txt查看文件名对应的 inode 号码

inode 包含文件的元信息,具体来说有以下内容:

  • 文件的字节数
  • 文件拥有者的 User ID
  • 文件的 Group ID
  • 文件的读、写、执行权限
  • 文件的时间戳,共有三个:ctime 指 inode 上一次变动的时间,mtime 指文件内容上一次变动的时间,atime 指文件上一次打开的时间。
  • 链接数,即有多少文件名指向这个 inode。
  • 文件数据块 block 的位置。

目录项 dirent

  • 目录(directory)也是一种文件,打开目录,实际上就是打开目录文件
  • 目录文件的结构非常简单,就是一系列目录项(dirent)的列表
  • 每个目录项,所包含文件的文件名,以及该文件名对应的 inode 号码
  • ls -i /etc

软链接 硬链接

  • 硬链接使用ln A B创建 A 链接到 B,两个文件都指向相同的 inode
  • 软链接使用ln -s A B创建 A 链接到 B,两个文件使用不通的 inode,但文件 A 的内容是文件 B 的路径,无论打开哪一个文件,最终读取的都是文件 B

重复执行命令

watch -n 1 "cat test1.sh >> test.txt"

-n 1代表停留 1 秒

while true; do date; sleep 1; done

循环的方式会有滚动的输出

请我喝杯咖啡吧 Coffee time !