Linux

DevOpssystem

# 一、Linux目录结构

树状目录结构:

使用 Linux 时,通过命令行输入 ls -l / 可以看到。

在 Linux 根目录(/)下包含很多的子目录(称为一级目录),例如 bin、boot、dev 等。

同时,各一级目录下还含有很多子目录(称为二级目录),比如 /bin/bash、/bin/ed 等。

Linux 文件系统目录总体呈现树形结构,/ 根目录就相当于树根。

# 一级目录

一级目录 功能(作用)
/bin/ 存放系统命令,普通用户和 root 都可以执行。放在 /bin 下的命令在单用户模式下也可以执行
/boot/ 系统启动目录,保存与系统启动相关的文件,如内核文件和启动引导程序(grub)文件等
/dev/ 设备文件保存位置
/etc/ 配置文件保存位置。系统内所有采用默认安装方式(rpm 安装)的服务配置文件全部保存在此目录中,如用户信息、服务的启动脚本、常用服务的配置文件等
/home/ 普通用户的主目录(也称为家目录)。在创建用户时,每个用户要有一个默认登录和保存自己数据的位置,就是用户的主目录,所有普通用户的主目录是在 /home/ 下建立一个和用户名相同的目录。如用户 liming 的主目录就是 /home/liming
/lib/ 系统调用的函数库保存位置
/media/ 挂载目录。系统建议用来挂载媒体设备,如软盘和光盘
/mnt/ 挂载目录。早期 Linux 中只有这一个挂载目录,并没有细分。系统建议这个目录用来挂载额外的设备,如 U 盘、移动硬盘和其他操作系统的分区
/misc/ 挂载目录。系统建议用来挂载 NFS 服务的共享目录。虽然系统准备了三个默认挂载目录 /media/、/mnt/、/misc/,但是到底在哪个目录中挂载什么设备可以由管理员自己决定。例如,笔者在接触 Linux 的时候,默认挂载目录只有 /mnt/,所以养成了在 /mnt/ 下建立不同目录挂载不同设备的习惯,如 /mnt/cdrom/ 挂载光盘、/mnt/usb/ 挂载 U 盘,都是可以的
/opt/ 第三方安装的软件保存位置。这个目录是放置和安装其他软件的位置,手工安装的源码包软件都可以安装到这个目录中。不过笔者还是习惯把软件放到 /usr/local/ 目录中,也就是说,/usr/local/ 目录也可以用来安装软件
/root/ root 的主目录。普通用户主目录在 /home/ 下,root 主目录直接在“/”下
/sbin/ 保存与系统环境设置相关的命令,只有 root 可以使用这些命令进行系统环境设置,但也有些命令可以允许普通用户查看
/srv/ 服务数据目录。一些系统服务启动之后,可以在这个目录中保存所需要的数据
/tmp/ 临时目录。系统存放临时文件的目录,在该目录下,所有用户都可以访问和写入。建议此目录中不能保存重要数据,最好每次开机都把该目录清空
/usr/ 用于存放系统应用程序,比较重要的目录/usr/local 本地管理员软件安装目录
/var/ 用于存放运行时需要改变数据的文件
/lost+found/ 当系统意外崩溃或意外关机时,产生的一些文件碎片会存放在这里。在系统启动的过程中,fsck 工具会检查这里,并修复已经损坏的文件系统。这个目录只在每个分区中出现,例如,/lost+found 就是根分区的备份恢复目录,/boot/lost+found 就是 /boot 分区的备份恢复目录
/proc/ 虚拟文件系统。该目录中的数据并不保存在硬盘上,而是保存到内存中。主要保存系统的内核、进程、外部设备状态和网络状态等。如 /proc/cpuinfo 是保存 CPU 信息的,/proc/devices 是保存设备驱动的列表的,/proc/filesystems 是保存文件系统列表的,/proc/net 是保存网络协议信息的......
/sys/ 虚拟文件系统。和 /proc/ 目录相似,该目录中的数据都保存在内存中,主要保存与内核相关的信息

# usr目录

usr(注意不是 user),全称为 Unix Software Resource,此目录用于存储系统软件资源

FHS 建议所有开发者,应把软件产品的数据合理的放置在 /usr 目录下的各子目录中,而不是为他们的产品创建单独的目录。

Linux 系统中,所有系统默认的软件都存储在 /usr 目录下,/usr 目录类似 Windows 系统中 C:\Windows\ + C:\Program files\ 两个目录的综合体。

FHS 建议,/usr 目录应具备下表所示的子目录。

子目录 功能(作用)
/usr/bin/ 存放系统命令,普通用户和超级用户都可以执行。这些命令和系统启动无关,在单用户模式下不能执行
/usr/sbin/ 存放根文件系统不必要的系统管理命令,如多数服务程序,只有 root 可以使用。
/usr/lib/ 应用程序调用的函数库保存位置
/usr/XllR6/ 图形界面系统保存位置
/usr/local/ 手工安装的软件保存位置。我们一般建议源码包软件安装在这个位置
/usr/share/ 应用程序的资源文件保存位置,如帮助文档、说明文档和字体目录
/usr/src/ 源码包保存位置。我们手工下载的源码包和内核源码包都可以保存到这里。不过笔者更习惯把手工下载的源码包保存到 /usr/local/src/ 目录中,把内核源码保存到 /usr/src/linux/ 目录中
/usr/include C/C++ 等编程语言头文件的放置目录

# var 目录

/var 目录用于存储动态数据,例如缓存、日志文件、软件运行过程中产生的文件等。

通常,此目录下建议包含如下表所示的这些子目录。

/var子目录 功能(作用)
/var/lib/ 程序运行中需要调用或改变的数据保存位置。如 MySQL (opens new window) 的数据库保存在 /var/lib/mysql/ 目录中
/var/log/ 登陆文件放置的目录,其中所包含比较重要的文件如 /var/log/messages, /var/log/wtmp 等。
/var/run/ 一些服务和程序运行后,它们的 PID(进程 ID)保存位置
/var/spool/ 里面主要都是一些临时存放,随时会被用户所调用的数据,例如 /var/spool/mail/ 存放新收到的邮件,/var/spool/cron/ 存放系统定时任务。
/var/www/ RPM 包安装的 Apache 的网页主目录
/var/nis和/var/yp NIS 服务机制所使用的目录,nis 主要记录所有网络中每一个 client 的连接信息;yp 是 linux 的 nis 服务的日志文件存放的目录
/var/tmp 一些应用程序在安装或执行时,需要在重启后使用的某些文件,此目录能将该类文件暂时存放起来,完成后再行删除

# 二、Linux命令

# Linux常用命令

命令 说明
stat 显示指定文件的相关信息,比ls命令显示内容更多
who 显示在线登录用户
top 显示当前系统中耗费资源最多的进程
pwd 显示当前用户所在的路径
ps 显示瞬间的进程状态
clear 清屏
last 最近登录人的信息
last -n 5 显示最近5个
service –status-all 查看系统中所有的后台服务
halt 关机
reboot 重启
df -h 查看磁盘的空间
uname -m 检查系统位数(内核版本)
lsb_release -a 查看系统版本
free -h 显示当前内存和交换空间的使用情况
kill 杀死一个进程
whereis 查找文件位置

# 查看内存

free -h
1

第一部分(Mem行)

  • total:内存总数 7953M
  • used:已经使用的内存数 6990m
  • free:空闲的内存数 192 m
  • shared:多个进程的共享的内存数 1m
  • buffers Buffer:缓存内存数 771m
  • cached Page:缓存内存数 771m

关系:total = used+ free

第二部分-交换分区(Swap行)

把磁盘空间当做内存用,也就是windows为什么常常提示虚拟空间不足的原因.。

在内存还有大部分的时候,拿出一部分硬盘空间来充当内存.硬盘怎么会快过内存。

linux只要不用swap的交换空间,就不用担心自己的内存太少。

如果常常swap用很多,可能你就要考虑加物理内存了。

# 关机命令

# 重启

reboot
1

关机后重新开机

shutdown -r now
1

# shutdown 命令

关机

shutdown -h now
1

shutdown 命令可以用来进行关机程序,并且在关机以前传送讯息给所有使用者正在执行的程序,shutdown 也可以用来重开机。

命令 语法
shutdown shutdown [-t seconds][-rkhncfF] time [message]

参数说明:

  • -t seconds 设定在几秒钟之后进行关机程序
  • -k 并不会真的关机,只是将警告讯息传送给所有只用者
  • -r 关机后重新开机(重启)
  • -h 关机后停机
  • -n 不采用正常程序来关机,用强迫的方式杀掉所有执行中的程序后自行关机
  • -c 取消目前已经进行中的关机动作
  • -f 关机时,不做 fcsk 动作(检查 Linux 档系统)
  • -F 关机时,强迫进行 fsck 动作
  • time 设定关机的时间
  • message 传送给所有使用者的警告讯息

# su命令

Linux中切换用户的命令是su或su -。

su命令和su -命令最大的本质区别就是:

前者只是切换了root身份,但Shell环境仍然是普通用户的Shell;而后者连用户和Shell环境一起切换成root身份了。只有切换了Shell环境才不会出现PATH环境变量错误。

su切换成root用户以后,pwd一下,发现工作目录仍然是普通用户的工作目录;而用su -命令切换以后,工作目录变成root的工作目录了。

用echo $PATH命令看一下su和su -以后的环境变量有何不同。以此类推,要从当前用户切换到其它用户也一样,应该使用su -命令。

  1. su的作用是变更为其它使用者的身份,需要键入该使用者的密码(超级用户除外)。
  2. 格式

su [选项]... [-][USER [ARG]...]

  1. 主要参数
  • -f , --fast:不必读启动文件(如 csh.cshrc 等),仅用于csh或tcsh两种Shell。
  • -l , --login:加了这个参数之后,就似乎是重新登陆为该使用者一样,大部分环境变量(例如HOME、SHELL和USER等)都是以该使用者(USER)为主,并且工作目录也会改变。假如没有指定USER,缺省情况是root。
  • -m, -p ,--preserve-environment:执行su时不改变环境变数。
  • -c command:变更账号为USER的使用者,并执行指令(command)后再变回原来使用者。
  • USER:欲变更的使用者账号,ARG传入新的Shell参数。

# 查看登录日志

last命令常用参数

  • -a: 将从何处登录的IP或主机名字,放到展示列的最后一列
  • -n: 输出多少行记录信息
  • -R: 为了安全,不输出从何处登录的IP信息
  • -x: 只显示关机、重启、等级切换的信息

查看linux 关机、重启、运行级别切换记录

last -x -n 10
1
  • reboot:重启
  • shutdown:关机
  • runlevel:运行级别切换

屏蔽登录IP地址的显示

last -R -n 10
1

Linux查看/var/log/wtmp文件查看可疑IP登陆

last -f /var/log/wtmp
1

该日志文件永久记录每个用户登录、注销及系统的启动、停机的事件。因此随着系统正常运行时间的增加,该文件的大小也会越来越大,增加的速度取决于系统用户登录的次数。

该日志文件可以用来查看用户的登录记录,last命令就通过访问这个文件获得这些信息,并以反序从后向前显示用户的登录记录,last也能根据用户、终端tty或时间显示相应的记录。

查看/var/log/secure文件寻找可疑IP登陆次数

/var/log/secure|grep IP地址
1

# 三、Linux命令-网络

命令 说明
hostname 查看主机名
netstat 显示网络状态信息
netstat -nlpt 查看端口
ping 测试网络的连通性
ifconfig 查看linux 系统ip地址

# 防火墙

常见的linux系统防火墙有:ufwfirewalliptables

  • ufw是Debian系列的默认防火墙(如ubuntu20.x);
  • firewall 是红帽系列7及以上的防火墙(如CentOS7.x);
  • iptables是红帽系列6及以下(如CentOS6.x)的防火墙。

首先,iptables是最底层、最古老的防火墙系统,所有系统都会存在此防火墙,但一般而言只需保证该防火墙处于完全开放状态即可,其他不用管他,更不需要复杂的配置。

而ufw和firewall都是较新linux系统上的替代iptables的工具,firewall和ufw可共同影响服务器,任一防火墙开启都会使端口无法连接。

例如:在ubuntu20.04服务器上,也可以安装firewall。就算ufw和iptable关闭,但若firewall处于开启状态,端口也无法连接。

# ufw

  • 基础命令

    apt-get install ufw #安装
    ufw enable #启动
    ufw disable #禁用
    ufw reload #重新载入
    ufw reset #回复初始化设置
    ufw status #防火墙状态
    
    1
    2
    3
    4
    5
    6
  • 打开/关闭某个端口

    ufw allow|deny [service]

    ufw allow smtp #允许所有的外部IP访问本机的25/tcp (smtp)端口
    ufw allow 22/tcp #允许所有的外部IP访问本机的22/tcp (ssh)端口
    ufw allow 53 #允许外部访问53端口(tcp/udp)
    ufw allow from ip_address #允许此IP访问所有的本机端口
    ufw deny port #拒绝访问本机端口
    
    1
    2
    3
    4
    5
  • 本机端口的设置

    #允许|禁止本地端口访问此 IP
    ufw allow|deny to 172.26.106.87
    
    #允许|禁止 本地访问 指定IP 的某些端口
    ufw allow|deny to ip_address port 22,20,10:120 proto tcp|udp|ssh
    
    #允许|禁止 本地访问 指定网卡 virbr0 指定IP 的 特定端口
    ufw allow|deny in on virbr0 to ip_address port num proto udp|tcp
    
    1
    2
    3
    4
    5
    6
    7
    8
  • 目标端口设置

    #允许|禁止 指定IP访问本地
    ufw allow|deny from 172.26.106.87
    
    #允许|禁止 指定IP 的某些端口 访问 本地IP
    ufw allow|deny from ip_address port 22,20,10:120 proto tcp|udp|ssh
    
    #允许|禁止 指定ip 指定网卡 virbr0 指定IP 的 特定端口 访问本地
    ufw allow|deny out on virbr0 from ip_address port num proto udp|tcp
    
    
    1
    2
    3
    4
    5
    6
    7
    8
    9

ufw命令详细说明:

ufw  [--dry-run]  [delete] [insert NUM] allow|deny|reject|limit [in|out on INTERFACE] [log|log-all] [proto protocol] [from ADDRESS [port PORT]] [to ADDRESS [port PORT]]
#命令 [–试运行][删除][插到x号规则之前] 允许|阻止|拒绝|限制 [进|出 基于“什么网络设备”] [协议 “协议”] [来源 “地址” [端口 “端口”]] [目标 “地址” [端口 “端口”]]
1
2

# firewalld

  • 安装

    apt-get install firewalld
    
    1
  • 启用禁用

    #在开机时启用
    systemctl enable firewalld.service
    #在开机时禁用
    systemctl disable firewalld.service
    #停止
    systemctl stop firewalld
    #查看防火墙状态
    systemctl status firewalld.service
    
    1
    2
    3
    4
    5
    6
    7
    8

在每次修改端口和服务后/etc/firewalld/zones/public.xml文件就会被修改,所以也可以在文件中之间修改,然后重新加载。 使用命令实际也是在修改文件,需要重新加载才能生效。

  • firewall-cmd

    #查看防火墙状态
    firewall-cmd --state
    #查看版本
    firewall-cmd --version
    #查看帮助
    firewall-cmd --help
    
    #更新防火墙规则
    firewall-cmd --reload
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
  • 开放端口

    #查看防火墙所有开放的端口
    firewall-cmd --zone=public --list-ports
    
    firewall-cmd --zone=public --add-port=5672/tcp --permanent   # 开放5672端口
    firewall-cmd --zone=public --remove-port=5672/tcp --permanent  #关闭5672端口
    firewall-cmd --reload   # 配置立即生效
    firewall-cmd --zone= public --query-port=80/tcp  #查看
    firewall-cmd --zone= public --remove-port=80/tcp --permanent  # 删除
    
    1
    2
    3
    4
    5
    6
    7
    8

    参数解释:

    –add-service #添加的服务 –zone #作用域 –add-port=80/tcp #添加端口,格式为:端口/通讯协议 –permanent #永久生效,没有此参数重启后失效​

# 四、Linux命令-文件

# Liunx文件相关命令

命令 说明
cd 切换目录,切换当前用户所在的路径
cd \ 表示切换到根目录
cd ~ 表示回到当前用户的根目录
mkdir 创建文件夹
ll –a 查看所有文件,包括隐藏文件
touch xxx.txt 创建空文件
echo 内容 > 文件名称 表示向文件中写内容,>表示覆盖写,>>表示追加写
rmdir 文件夹名称 删除文件夹
rm –rf 文件 删除文件中所有的内容。并且不提示是否删除
cat 文件名 查看文件内容
more 文件名 可以翻页查看,下翻一页 空格;上翻一页 b;退出 q;
less 文件名 可以翻页查看(可以一行一行翻),下翻一页 空格;上翻一页 b;
tail -10 文件名 查看文件尾部的10行
wc -l 文件名 统计行数
du -sh 文件名 查看文件大小
grep 在文件中查找指定关键字

# 在文件中查找指定关键字

语法

grep [选项] [查找模式] [文件名1, 文件名2, ...]
1

示例

# 在文件中查找指定关键字
grep "world" log.txt
# 多文件查找指定关键字
grep "world" log.txt log2.txt log3.txt
# 在文件中查找指定关键字,并显示行号
grep -n "world" log.txt
# 统计匹配到的总行数
grep -c "o" log.txt

1
2
3
4
5
6
7
8
9

# 压缩解压

在Linux平台,tar是主要的打包工具。

tar命令通常用来把文件和目录压缩为一个文件( tarball 或 tar, gzip 和 bzip)。

# Tar参数选项

参数 作用
c 创建压缩文件
x 解压文件
v 显示进度.
f 文件名
t 查看压缩文件内容
j 通过bzip2归档
z 通过gzip归档
r 在压缩文件中追加文件或目录

# 常用命令

1、tar

打包为code.tar:

tar -cvf code.tar /home/abc/code/
1

解压 tar 包

tar -xvf code.tar -C /home/abc/code
1

2、tar.gz

压缩为 tar.gz 格式的包

tar -zcvf code.tar.gz /home/abc/code
1

解压 tar.gz 包

tar -zxvf code.tar.gz
1

# vi操作

使用vi命令对文件信息编辑

# 最基本用法

vi 文件名

vi my.cnf
1

(1、首先会进入“一般模式”,此模式只接受各种快捷键,不能编辑文件内容

(2、按i键,就会从一般模式进入编辑模式,此模式下,敲入的都是文件内容

(3、编辑完成之后,按Esc键退出编辑模式,回到一般模式;

(4、再按 进入“底行命令模式”,输入wq命令,回车即可

退出编辑模式并保存数据 使用 :wq 回车

如果是退出不保存 使用 :q! 回车

# 一些常用快捷键

一些有用的快捷键(在一般模式下使用):

快捷键 作用
a 在光标后一位开始插入
A 在该行的最后插入
I 在该行的最前面插入
gg 直接跳到文件的首行
G 直接跳到文件的末行
dd 删除行,如果 5dd ,则一次性删除光标 的5行
yy 把光标移动到要复制的行上,复制当前行, 然后把光标移动到要复制的位置,按p 粘贴
复制多行,则 3yy,复制当前行附近的3行
v 进入字符选择模式,选择完成后,按y复制,按p粘贴
ctrl+v 进入块选择模式,选择完成后,按y复制,按p粘贴
shift+v 进入行选择模式,选择完成后,按y复制,按p粘贴

在底行命令模式中输入使用:

快捷键 作用
/you 查找。效果:查找文件中出现的you,并定位到第一个找到的地方,按n可以定位到下一个匹配位置(按N定位到上一个)
%s/sad/888 查找并替换(在底行命令模式中输入)。效果:查找文件中所有sad,替换为888

# 文件权限

linux文件权限的描述格式解读

drwxr-xr-x      (也可以用二进制表示  111 101 101  -->  755
1
  • d:标识节点类型(d:文件夹 -:文件 l:链接)

  • r:可读

  • w:可写

  • x:可执行

第一组rwx: 表示这个文件的拥有者对它的权限:可读可写可执行

第二组r-x: 表示这个文件的所属组对它的权限:可读,不可写,可执行

第三组r-x: 表示这个文件的其他用户(相对于上面两类用户)对它的权限:可读,不可写,可执行

# 修改文件权限

1、使用rwx增减

# 表示将haha.dat对所属组的rw权限取消
chmod g-rw haha.dat

# 表示将haha.dat对其他人的rw权限取消
chmod o-rw haha.dat

# 表示将haha.dat对所属用户的权限增加x
chmod u+x haha.dat
1
2
3
4
5
6
7
8

2、使用数字修改权限

chmod 664 haha.dat  
# 就会修改成   rw-rw-r--
1
2

3、统一修改

(一) 如果要将一个文件夹的所有内容权限统一修改,则可以-R参数

chmod -R 770 aaa/
1

# 五、crontab定时任务

# crond简介

crond是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程。

与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动crond进程。

crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。

Linux下的任务调度分为两类,系统任务调度用户任务调度

# 系统任务调度

  1. 系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。

在/etc目录下有一个crontab文件,这个就是系统任务调度的配置文件。

/etc/crontab文件包括下面几行:

cat /etc/crontab
1

前四行是用来配置crond任务运行的环境变量:

  • 第一行SHELL变量指定了系统要使用哪个shell,这里是/bin/sh;
  • 第二行PATH变量指定了系统执行命令的路径;
  • 第三行MAILTO变量指定了crond的任务执行信息将通过电子邮件发送给root用户,如果MAILTO变量的值为空,则表示不发送任务执行信息给用户;
  • 第四行的HOME变量指定了在执行命令或者脚本时使用的主目录。

# 用户任务调度

用户定期要执行的工作,比如用户数据备份、定时邮件提醒等。

用户可以使用 crontab 工具来定制自己的计划任务。

所有用户定义的crontab 文件都被保存在 /var/spool/cron目录中。其文件名与用户名一致。

# 使用者权限文件

  • 文件1: /etc/cron.deny

    说明:该文件中所列用户不允许使用crontab命令

  • 文件2:/etc/cron.allow

    说明:该文件中所列用户允许使用crontab命令

  • 文件3:/var/spool/cron/

    说明:所有用户crontab文件存放的目录,以用户名命名

# crontab文件的含义

  1. 用户所建立的crontab文件中,每一行都代表一项任务,每行的每个字段代表一项设置,它的格式共分为六个字段,前五段是时间设定段,第六段是要执行的命令段,格式如下:

minute hour day month week command

  1. 其中:
  • minute: 表示分钟,可以是从0到59之间的任何整数。
  • hour:表示小时,可以是从0到23之间的任何整数。
  • day:表示日期,可以是从1到31之间的任何整数。
  • month:表示月份,可以是从1到12之间的任何整数。
  • week:表示星期几,可以是从0到7之间的任何整数,这里的0或7代表星期日。
  • command:要执行的命令,可以是系统命令,也可以是自己编写的脚本文件。

  1. 在以上各个字段中,还可以使用以下特殊字符:
  • 星号(*****):代表所有可能的值,例如month字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。
  • 逗号(,):可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”
  • 中杠(-):可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”
  • 正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如*/10,如果用在minute字段,表示每十分钟执行一次。

# 使用实例

实例1:每1分钟执行一次command

命令:

* * * * * command
1

实例2:每小时的第3和第15分钟执行

命令:

3,15 * * * * command
1

实例3:在上午8点到11点的第3和第15分钟执行

命令:

3,15 8-11 * * * command
1

实例4:每隔两天的上午8点到11点的第3和第15分钟执行

命令:

3,15 8-11 */2 * * command
1

实例5:每个星期一的上午8点到11点的第3和第15分钟执行

命令:

3,15 8-11 * * 1 command
1

实例6:每晚的21:30重启smb

命令:

30 21 * * * /etc/init.d/smb restart
1

实例7:每月1、10、22日的4 : 45重启smb

命令:

45 4 1,10,22 * * /etc/init.d/smb restart
1

实例8:每周六、周日的1 : 10重启smb

命令:

10 1 * * 6,0 /etc/init.d/smb restart
1

实例9:每天18 : 00至23 : 00之间每隔30分钟重启smb

命令:

0,30 18-23 * * * /etc/init.d/smb restart
1

实例10:每星期六的晚上11 : 00 pm重启smb

命令:

0 23 * * 6 /etc/init.d/smb restart
1

实例11:每一小时重启smb

命令:

* */1 * * * /etc/init.d/smb restart
1

实例12:晚上11点到早上7点之间,每隔一小时重启smb

命令:

* 23-7/1 * * * /etc/init.d/smb restart
1

实例13:每月的4号与每周一到周三的11点重启smb

命令:

0 11 4 * mon-wed /etc/init.d/smb restart
1

实例14:一月一号的4点重启smb

命令:

0 4 1 jan * /etc/init.d/smb restart
1

实例15:每小时执行/etc/cron.hourly目录内的脚本

命令:

01   *   *   *   *     root run-parts /etc/cron.hourly
1

说明:

run-parts这个参数了,如果去掉这个参数的话,后面就可以写要运行的某个脚本名,而不是目录名了

# crond服务

  1. 安装crontab:
yum install crontabs
1
  1. 服务操作说明:
/sbin/service crond start //启动服务

/sbin/service crond stop //关闭服务

/sbin/service crond restart //重启服务

/sbin/service crond reload //重新载入配置
1
2
3
4
5
6
7
  1. 查看crontab服务状态:
service crond status
1
  1. 手动启动crontab服务:
service crond start
1
  1. 查看crontab服务是否已设置为开机启动,执行命令:
ntsysv
1
  1. 加入开机自动启动:
chkconfig –level 35 crond on
1

# 使用注意事项

1. 注意环境变量问题

有时我们创建了一个crontab,但是这个任务却无法自动执行,而手动执行这个任务却没有问题,这种情况一般是由于在crontab文件中没有配置环境变量引起的。

在crontab文件中定义多个调度任务时,需要特别注意的一个问题就是环境变量的设置,因为我们手动执行某个任务时,是在当前shell环境下进行的,程序当然能找到环境变量,而系统自动执行任务调度时,是不会加载任何环境变量的,因此,就需要在crontab文件中指定任务运行所需的所有环境变量,这样,系统执行任务调度时就没有问题了。

不要假定cron知道所需要的特殊环境,它其实并不知道。所以你要保证在shelll脚本中提供所有必要的路径和环境变量,除了一些自动设置的全局变量。所以注意如下3点:

1)脚本中涉及文件路径时写全局路径

2)脚本执行要用到java或其他环境变量时,通过source命令引入环境变量,如:

cat start_cbp.sh

#!/bin/sh

source /etc/profile

export RUN_CONF=/home/d139/conf/platform/cbp/cbp_jboss.conf

/usr/local/jboss-4.0.5/bin/run.sh -c mev &

3)当手动执行脚本OK,但是crontab死活不执行时。这时必须大胆怀疑是环境变量惹的祸,并可以尝试在crontab中直接引入环境变量解决问题。如:

0 * * * * . /etc/profile;/bin/sh /var/www/java/audit_no_count/bin/restart_audit.sh

2. 注意清理系统用户的邮件日志

每条任务调度执行完毕,系统都会将任务输出信息通过电子邮件的形式发送给当前系统用户,这样日积月累,日志信息会非常大,可能会影响系统的正常运行,因此,将每条任务进行重定向处理非常重要。

例如,可以在crontab文件中设置如下形式,忽略日志输出:

0 */3 * * * /usr/local/apache2/apachectl restart >/dev/null 2>&1

“/dev/null 2>&1”表示先将标准输出重定向到/dev/null,然后将标准错误重定向到标准输出,由于标准输出已经重定向到了/dev/null,因此标准错误也会重定向到/dev/null,这样日志输出问题就解决了。

3. 系统级任务调度与用户级任务调度

系统级任务调度主要完成系统的一些维护操作,用户级任务调度主要完成用户自定义的一些任务,可以将用户级任务调度放到系统级任务调度来完成(不建议这么做),但是反过来却不行,root用户的任务调度操作可以通过“crontab –uroot –e”来设置,也可以将调度任务直接写入/etc/crontab文件,需要注意的是,如果要定义一个定时重启系统的任务,就必须将任务放到/etc/crontab文件,即使在root用户下创建一个定时重启系统的任务也是无效的。

4. 其他注意事项

新创建的cron job,不会马上执行,至少要过2分钟才执行。如果重启cron则马上执行。

当crontab突然失效时,可以尝试/etc/init.d/crond restart解决问题。或者查看日志看某个job有没有执行/报错tail -f /var/log/cron。

千万别乱运行crontab -r。它从Crontab目录(/var/spool/cron)中删除用户的Crontab文件。删除了该用户的所有crontab都没了。

在crontab中**%是有特殊含义的,表示换行的意思。如果要用的话必须进行转义%**,如经常用的date ‘+%Y%m%d’在crontab里是不会执行的,应该换成date ‘+%Y%m%d

# 六、yum本地源

# 1. 什么是YUM

YUM(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及CentOS中的Shell前端软件包管理器。

基于RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包,无须繁琐地一次次下载、安装。

# 2. YUM的作用

在Linux上使用源码的方式安装软件非常满分,使用yum可以简化安装的过程。

# 3. YUM的常用命令

  1. 安装httpd并确认安装
yum instll -y httpd
1
  1. 列出所有可用的package和package组
yum list
1
  1. 清除所有缓冲数据
yum clean all
1
  1. 列出一个包所有依赖的包
yum deplist httpd
1
  1. 删除httpd
yum remove httpd
1

# 七、系统初始化配置

# 配置静态IP

找到/etc/sysconfig/network-scripts/ifcfg-eth0

vim /etc/sysconfig/network-scripts/ifcfg-eth0
1

需要添加属性,给对应的属性添加值!

DEVICE=eth0 	# 读取那个配置文件
ONBOOT=no 		#配置开启自动读取 --- yes
BOOTPROTO=dhcp  # 将动态获取ip改为静态获取 --- static
IPADDR=192.168.121.64
NETMASK=255.255.255.0
GATEWAY=192.168.121.2
DNS1=114.114.114.114
DNS2=8.8.8.8
1
2
3
4
5
6
7
8

# 修改主机名

更改/etc/sysconfig下的network文件

vi /etc/sysconfig/network
1

然后将HOSTNAME后面的值改为想要设置的主机名。

# 关闭防火墙

查看防火墙状态

service  iptables status 
1

永久性生效

# 开启:
chkconfig iptables on

# 关闭:
chkconfig iptables off

# 查看是否关闭:
chkconfig iptables --list**
1
2
3
4
5
6
7
8

即时生效,重启后失效

#开启:
service iptables start

#关闭:
service iptables stop
1
2
3
4
5

# 八、安装JDK

# 上次JDK安装包

先创建一个java文件夹

mkdir -m /usr/local/java
1

上传到/usr/local/java 该目录中!

# 解压JDK

使用tar –zxvf 命令解压该文件

tar -zxvf jdk-7u80-linux-x64.tar.gz
1
  • x : 从 tar 包中把文件提取出来
  • z : 表示 tar 包是被 gzip 压缩过的,所以解压时需要用 gunzip 解压
  • v : 显示详细信息
  • f xxx.tar.gz : 指定被处理的文件是 xxx.tar.gz
  • z 是因为你解压gz的文件 x是从文档中释放 v是报告详细信息 f是使用tar必选的,放最后。 不一定要是zxvf 这是参数 给你一些其他的参数。如果是以tar后缀的-xvf

# 配置系统环境变量

注意:若是普通用户,请略过该操作!

利用vi编辑器 来配置

vi /etc/profile
1

需要配置的环境变量有

JAVA_HOME=/usr/local/java/jdk1.7.0_80
CLASSPATH=$JAVA_HOME/lib
PATH=$PATH:$JAVA_HOME/bin
export JAVA_HOME CLASSPATH PATH
1
2
3
4

配置完成之后,加载配置文件

source /etc/profile
1

可以使用java –version 进行测试!

# 配置用户环境变量

这里我为了更好区分,普通用户使用的jdk版本为1.7.

cd /home/用户名
1

进到普通用户的家目录下,可以看到用户的环境变量文件.bash_profile(该文件为隐藏文件)

vim .bash_profile
1

添加

JAVA_HOME=/data/jdk/jdk1.8.0_201
1

配置完成之后,加载配置文件

source /etc/profile
1

执行java -version后可以看到jdk版本!

# 九、安装mysql(5.6)数据库

# 解压mysql安装包

导入mysql的压缩包

解压压缩包

tar -zxvf mysql-5.6.31-linux-glibc2.5-x86_64.tar.gz
1

拷贝到 /usr/local/mysql

cp -r mysql-5.6.31-linux-glibc2.5-x86_64 /usr/local/mysql
1

注意:事先mysql文件夹是没有的!不用去刻意建立mysql文件夹。

# 添加mysql 用户组

groupadd mysql
1

# 添加mysql用户名

useradd –g mysql mysql
1

# 安装

进入mysql解压的目录

cd /usr/local/mysql
1

在mysql的data文件夹下创建一个mysql文件夹,用来后续配置文件路径的时候使用!

cd data
mkdir mysql
cd ..
1
2
3

给mysql文件授权

chown mysql:mysql  ./
1

进行安装,Scripts里面有一个mysql_install_db

./scripts/mysql_install_db --user=mysql --datadir=/usr/local/mysql/data/mysql
1

去拷贝文件mysql.service 服务到系统环境变量中

cp support-files/mysql.server /etc/init.d/mysqld
1

授予可以执行权限

chmod 755 /etc/init.d/mysqld
1

去拷贝配置文件

cp support-files/my-default.cnf /etc/my.cnf
1

重新编辑/etc/my.cnf

vi /etc/my.cnf
1

修改basedir、databir路径地址

basedir = /usr/local/mysql
databir = /usr/local/mysql/data/mysql
1
2

# 启动mysql

service mysqld start
1

测试:如何连接数据库

cd /usr/local/mysql/bin
1

# 十、安装Samba服务器

Samba服务器,可以实现在不同操作系统之间的文件资源共享

局域网中安装samba服务器,可以实现Windows和Linux资源互通。

参考资料 (opens new window)

# 配置(centOS)

  1. 修改防火墙设置。

    # 允许增加samba服务,permanent表示允许
    firewall-cmd --permanent --add-service=samba
    # 重启防火墙
    firewall-cmd --reload
    
    1
    2
    3
    4
  2. 安装samba服务。

    # 安装服务器端,和客户端
    yum install samba samba-client -y
    # 启动服务
    systemctl start smb nmb
    # 查看服务是否启动
    systemctl status smb nmb
    
    1
    2
    3
    4
    5
    6
  3. 建立需要共享的文件夹。

    mkdir /usr/local/company/share
    
    1
  4. 创建可以访问的账号。

    # useradd -s /sbin/nologin xzuser
    # useradd -s /sbin/nologin gcuser
    # useradd -s /sbin/nologin xsuser
    
    /sbin/nologin :为用户的bash类型,/sbin/nologin:用户不能登录系统
    
    添加为samba用户:
    # smbpasswd -a xzuser --> 密码 123456
    # smbpasswd -a gcuser --> 密码 123456
    # smbpasswd -a xsuser --> 密码 123456
    
    smbpasswd选项:-a添加smb账号;-x删除smb账号;-d禁用smb账号;-e启用smb账号;
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
  5. 修改配置文件:vim /samba/smb.conf

    修改前先备份文件,在配置文件smb.conf的最后添加下面的内容。

    # vim /samba/smb.conf
    修改前先备份文件
    # cp smb.conf smb.conf.bak
    在文件最后添加:
    [company]	#共享名
    	comment = company share	#注释说明
    	path = /home/company	#共享文件路径
    	browseable = yes		#允许所有人可见
    	guest ok = no			#不允许匿名访问
    	writeable = yes			#允许用户写入数据
    	
    修改文件后重启服务:重启服务失败,可能是配置文件错误
    # systemctl restart smb nmb
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
  6. 限制用户访问。

    修改配置文件:vim /samba/smb.conf

    [company] :共享名
    	comment=company share  :注释说明
    	path=/home/company     :共享文件路径
    	gues ok=no             :不允许匿名访问
    	valid users=xzuser,xsuser :指定用户访问
    	write list=xzuser         :指定用户有写入权限
    
    1
    2
    3
    4
    5
    6

    重启服务

    service smbd restart
    
    1
  7. 限制组的访问。

    修改配置文件:vim /samba/smb.conf

    [company]
    	valid users = @samba,@groups
    	write list = @samba
    samba,groups:组名
    
    把用户加入到组中:
    gpasswd -a 用户名 组名
    
    1
    2
    3
    4
    5
    6
    7

    重启服务

    service smbd restart
    
    1
  8. 查看samba服务器中已拥有哪些用户。

    pdbedit -L
    
    1

# 配置(ubuntu)

1、更新当前软件。

apt-get upgrade
apt-get update
apt-get dist-upgrade
1
2
3

2、安装samba服务器。

apt-get install samba samba-common
1

3、创建一个用于共享的samba目录,并给共享目录设置权限。

mkdir -p /usr/local/公司名/share
chmod -R 777 /usr/local/公司名/share
1
2

4、添加Samba访问账号及密码,用于其他人或设备认证。

  • 该用户名需要和在后面配置的配置文件smb.conf中配置的用户相对应;
  • 这里添加的用户需要在系统账号中存在,否则添加失败;

在系统用户添加账户(该用户不能登录系统);

useradd -s /sbin/nologin 用户名
1

在Samba添加该用户;

smbpasswd -a 用户名
1

查看samba服务器中已拥有哪些用户(需要root权限);

pdbedit -L
1

拓展:smbpasswd命令的其他用法;

# 增加用户,加的用户必须以是系统用户
smbpasswd -a 用户名

# 冻结用户,就是这个用户不能在登录了
smbpasswd -d 用户名

# 恢复用户(解冻用户),让冻结的用户可以在使用
smbpasswd -e 用户名

# 删除用户
smbpasswd -x 用户名

# 查看支持的命令列表
smbpasswd -h
 
# 异常时可查看日志情况
cat /var/log/samba/log.%m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

5、修改配置samba的配置文件。

cp /etc/samba/smb.conf /etc/samba/smb.conf.bak
vim /etc/samba/smb.conf
1
2

在配置文件smb.conf的最后添加下面的内容:

[share]
  comment = share folder
  path = /usr/local/公司名/share
  public = no
  guest ok= no
  valid users = 用户名
  write list = 用户名,用户名2
  printable = no
1
2
3
4
5
6
7
8

拓展:详细配置说明如下;

[global]

    ; 创建工作组 设定 Samba Server 所要加入的工作组或者域  
    workgroup = WORKGROUP 

    ; 为了防止出现中文目录乱码的情况。其中根据你的local,UTF-8 有可能需要改成 cp936
    ; display charset = UTF-8
    unix charset = UTF-8
    dos charset = cp936 
	
    ; 是否允许guest用户访问
    guest ok = no
    
    ; 注:如果 #security 存在就直接修改,不存在就创建
    ; security = user 

    ; 安全模式  我们设置用户安全级别
    security = user 
	
	; 说明:用来定义用户名映射,比如可以将root换成administrator、admin等。不过要事先在smbusers文件中定义好。
	; 比如:root = administrator admin,这样就可以用administrator或admin这两个用户来代替root登陆Samba Server,更贴近windows用户的习惯。
    username map = /etc/Samba/smbusers 

; 共享名,该共享标签,该名字为在电脑上看到的共享名 注意网络映射的路径是这标签名字不是共享路径的名字
[share]

    ; 该共享描述
    comment = Shared Folder with username and password 

    ; 共享文件夹路径
    path = /home/yhq/

    ; 表示是否允许匿名访问该共享目录
    public = no

    ; 配置的Samba访问账号 指明可以访问的用户
    valid users = yhq

    ; 表示是否可以在 Window Explorer中显示该目录
    browsable = no

    ; 指明新建立的文件的属性
    create mask = 777 

    ; 指明新建立的目录的属性
    directory mask = 777

    ; force group 和force user 规定创建的文件或文件夹的拥有者和组拥有者是谁 
    ; 一般这两个值来空,则表示拥有者和组拥有者为创建文件者。 如设定值,如force group=yhq
    ; Force user=yhq,则不管是谁创建的文件和文件夹,拥有者都为yhq和yhq组。

    ; force user强制把建立文件的属主是谁。如果我有一个目录,让guest可以写,那么guest就可以删除,
    ; 如果我用force user=yhq强制建立文件的属主是yhq,同时限制create mask = 0755,
    ; 这样guest就不能删除了。

    force user = yhq 
    force group = yhq

    ; available用来指定该共享资源是否可用
    available = yes 

    ; 共享路径读权限 设置共享是否可浏览,如果no则表示隐藏,需要通过"//ip/共享目录"进行访问
    browseable = yes

    ; 共享路径写权限
    writable = yes
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66

6、重启samba服务器

service smbd restart
1

或者

# 重启samba服务器
/etc/init.d/samba restart

# 有的版本路径不是/etc/init.d/samba 可以尝试用
/etc/init.d/samba-ad-dc restart
1
2
3
4
5

# 连接使用

1、在Windows中访问samba服务

1、在Windows文件管理器中输入\\samba服务器ip地址 ,便可以看到samba服务共享的文件夹。

2、输入网络凭据:输入Samba访问账号及密码。

登录成功后,显示共享名share,进入查看共享目录相关资料内容。

2、将共享路径映射为Windows磁盘

若经常使用的共享,可直接映射为Windows的磁盘,不用每次都输ip。

1、输入IP进入共享名share

2、右键,点击映射网络驱动器

3、然后在我的电脑里就可以看到映射的网络磁盘了。

3、清除共享目录的用户名及密码(可选)

1、按下键盘上的win+r键,输入control userpasswords2,然后按下回车,打开用户账户窗口。

2、打开用户账户窗口之后,点击窗口上方选项卡菜单中的“高级”选项卡。然后点击下方的“管理密码”按钮。

3、点击之后,在新弹出的窗口中,找到要删除的文件夹共享用户名和密码,点击右侧的v字图标。

4、点击之后,在展开的密码信息下,点击“删除”即可。

# 十一、Linux常见问题

# Linux CPU占用100%排查

某服务器上部署了若干tomcat实例,即若干垂直切分的Java站点服务,以及若干Java微服务,突然收到运维的CPU异常告警。

问题:如何定位是哪个服务进程导致CPU过载,哪个线程导致CPU过载,哪段代码导致CPU过载?

解决步骤

步骤一、找到最耗CPU的进程

  • 工具:top

  • 方法:

    • 执行top -c ,显示进程运行信息列表
    • 键入P (大写p),进程按照CPU使用率排序

如下图,最耗CPU的进程PID为10765

步骤二:找到最耗CPU的线程

  • 工具:top

  • 方法:

    • top -Hp 10765 ,显示一个进程的线程运行信息列表

    • 键入P (大写p),线程按照CPU使用率排序

如下图,最耗CPU的进程PID为10765

步骤三:将线程PID转化为16进制

  • 工具:printf

  • 方法:printf “%x” 10804

如上图,10804对应的16进制是0x2a34,当然,这一步可以用计算器。

之所以要转化为16进制,是因为堆栈里,线程id是用16进制表示的。

步骤四:查看堆栈,找到线程在干嘛

  • 工具:pstack/jstack/grep

  • 方法:jstack 10765 | grep ‘0x2a34’ -C5 --color

    打印进程堆栈

    通过线程id,过滤得到线程堆栈

如上图,找到了耗CPU高的线程对应的线程名称“AsyncLogger-1”,以及看到了该线程正在执行代码的堆栈。

# X-FTP报错SFTP子系统申请已拒绝

问题:用X-shell进行打开远程文件的时候,可能会遇到如下提示错误:

SFTP 子系统申请已拒绝 请确保ssh连接的sftp子系统设置有效

解决步骤

1、查看 /etc/ssh/sshd_config文件,若无sftp相关配置项,添加如下配置

Subsystem  sftp  /usr/libexec/openssh/sftp-server 
1

重启sshd

sudo systemctl restart sshd
1

重启sshd后,重新链接Xshell,sftp即可正常工作。