Linux 基础


一, Linux下如何查看版本信息, 包括位数、版本信息以及CPU内核信息、CPU具体型号

1 系统信息查询大全

LTS ( Long-Term-Support) 意味着更稳定的功能和更长期(目前为 -- 5 年)的升级支持,生产环境中推荐尽量使用 LTS 版本。

  1.  uname -a (Linux查看版本当前操作系统内核信息)
  2.  cat /proc/version (Linux查看当前操作系统版本信息)
  3.  cat /etc/issue 或cat /etc/redhat-release(Linux查看版本当前操作系统发行版信息)
  4. head -n 1 /etc/issue # 查看操作系统版本 
  5. lsmod # 列出加载的内核模块 

2 cpu相关信息

  1. cat /proc/cpuinfo # 信息内容分别列出了processor 0 –processor n 的规格。这里需要注意,n+1是逻辑cpu数,逻辑CPU数量=物理cpu数量 x cpu cores 这个规格值 x 2(如果支持并开启ht)    
  2. lscpu (Linux查看cpu相关信息,包括型号、主频、内核信息等)
  3. getconf LONG_BIT (Linux查看版本说明当前CPU运行在32bit模式下, 但不代表CPU不支持64bit)
  4. 总核数 = 物理CPU个数 X 每颗物理CPU的核数,总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数
  5. cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l # 查看物理CPU个数
  6. cat /proc/cpuinfo| grep "cpu cores"| uniq  # 查看每个物理CPU中core的个数(即核数)
  7. cat /proc/cpuinfo| grep "processor"| wc -l  # 查看逻辑CPU的个数
  8. cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c  # 查看CPU信息(型号)
  9. Linux下top查看的CPU也是逻辑CPU个数,物理cpu数量可以数不重复的physical id有几个,

3 服务器名称

  1. hostname (查看服务器名称)
  2. 修改hostname: hostnamectl set-hostname test

4 网络,ip

  1. cat /etc/sysconfig/network-scripts/xxx
  2. ifconfig (查看网络信息)
  3. ip addr

5 磁盘信息

  1. lsblk (查看磁盘信息 - 列出所有可用块设备的信息,而且还能显示他们之间的依赖关系,但是它不会列出RAM盘的信息)
  2. fdisk -l (观察硬盘实体使用情况,也可对硬盘分区)
  3. df -k (用于显示磁盘分区上的可使用的磁盘空间)
  4. df -h # 查看各分区使用情况 
  5. du -sh <目录名> # 查看指定目录的大小
  6. hdparm -i /dev/hda # 查看磁盘参数(仅适用于IDE设备)

6 查看设备 

  1. lspci -tv # 列出所有PCI设备 
  2. lsusb -tv # 列出所有USB设备 

7 环境变量

  1. env # 查看环境变量资源 
  2. #!/bin/bash ;source /etc/prfile   #  写shell 脚本时这两条都写上

7 内存信息

  1. free -m # 查看内存使用量和交换区使用量 
  2. grep MemTotal /proc/meminfo # 查看内存总量
  3. grep MemFree /proc/meminfo # 查看空闲内存量 
  4. swapon -s  查看所有交换分区 

8 系统 相关

  1. cat /proc/loadavg # 查看系统负载磁盘和分区 
  2. mount | column -t # 查看挂接的分区状态 
  3. dmesg | grep IDE # 查看启动时IDE设备检测状况网络

9 端口监听

  1. iptables -L # 查看防火墙设置 
  2. route -n # 查看路由表 
  3. netstat -lntp # 查看所有监听端口 
  4. netstat -antp # 查看所有已经建立的连接 
  5. netstat -s # 查看网络统计信息进程 
  6. netstat -tnlp | grep :22
  7. ssh -v -p 22 10.39.40.117   # 22端口连通性判断
  8. lsof -i:22
  9. telnet ip port 

10 进程,用户,启动的系统服务

  1. top # 实时显示进程状态用户 
  2. w # 查看活动用户 
  3. id <用户名> # 查看指定用户信息 
  4. last # 查看用户登录日志 
  5. cut -d: -f1 /etc/passwd # 查看系统所有用户 
  6. cut -d: -f1 /etc/group # 查看系统所有组 
  7. crontab -l # 查看当前用户的计划任务服务 
  8. chkconfig –list # 列出所有系统服务 
  9. chkconfig –list | grep on # 列出所有启动的系统服务程序 
  10. ps -ef # 查看所有进程 
  11. pstree 查看完整的进程树结构 :yum -y install psmisc;pstree -a  3393;pstree -up, pstree -p 应用名或应用pid 
  12. 查看某进程可打开的文件数:cat /proc/pid/limits ; cat /proc/19234/limits

11 rpm相关

  1. rpm -qa # 查看所有安装的软件包,grep 过滤
  2. rpm -e  package,要卸载的安装包
  3. rpm -ivh --prefix=/opt  /home/xxx.rpm  安装到指定目录/opt

12 系统启动时间及已运行时间

  1. uptime # 查看系统运行时间、用户数、负载 
  2. cat /proc/uptime # 输出865298.88 843596.89,第一数字即是系统已运行的时间865298.88秒,
  3. 运用系统工具date即可算出系统启动时间: date -d "$(awk -F. '{print $1}' /proc/uptime) second ago" +"%Y-%m-%d %H:%M:%S"   输出:2020-07-30 16:55:51
  4. 系统已运行时间:cat /proc/uptime| awk -F. '{run_days=$1 / 86400;run_hour=($1 % 86400)/3600;run_minute=($1 % 3600)/60;run_second=$1 % 60;printf("系统已运行:%d天%d时%d分%d秒",run_days,run_hour,run_minute,run_second)}'  输出:系统已运行:10天0时32分32秒

13 网卡

  1. lspci | grep -i 'eth'  # 查看网卡硬件信息  
  2. ifconfig -a # 查看系统的所有网络接口 
  3. ethtool eth0 # 如果要查看某个网络接口的详细信息,例如eth0的详细参数和指标
  4. lspci # 查看pci信息,即主板所有硬件槽信息; 详细信息:lspci -v 或者 lspci -vv;看设备树:lspci -t

14 Linux /proc目录详解

1)/proc目录:

  Linux 内核提供了一种通过 /proc 文件系统,在运行时访问内核内部数据结构、改变内核设置的机制。proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。它以文件系统的方式为访问系统内核数据的操作提供接口。用户和应用程序可以通过proc得到系统的信息,并可以改变内核的某些参数。由于系统的信息,如进程,是动态改变的,所以用户或应用程序读取proc文件时,proc文件系统是动态从系统内核读出所需信息并提交的。下面列出的这些文件或子文件夹,并不是都是在你的系统中存在,这取决于你的内核配置和装载的模块。另外,在/proc下还有三个很重要的目录:net,scsi和sys。 Sys目录是可写的,可以通过它来访问或修改内核的参数,而net和scsi则依赖于内核配置。例如,如果系统不支持scsi,则scsi 目录不存在。除了以上介绍的这些,还有的是一些以数字命名的目录,它们是进程目录。系统中当前运行的每一个进程都有对应的一个目录在/proc下,以进程的 PID号为目录名,它们是读取进程信息的接口。而self目录则是读取进程本身的信息接口,是一个link。

2)子文件或子文件夹

  1. /proc/buddyinfo 每个内存区中的每个order有多少块可用,和内存碎片问题有关
  2. /proc/cmdline 启动时传递给kernel的参数信息
  3. /proc/cpuinfo cpu的信息
  4. /proc/crypto 内核使用的所有已安装的加密密码及细节
  5. /proc/devices 已经加载的设备并分类
  6. /proc/dma 已注册使用的ISA DMA频道列表
  7. /proc/execdomains Linux内核当前支持的execution domains
  8. /proc/fb 帧缓冲设备列表,包括数量和控制它的驱动
  9. /proc/filesystems 内核当前支持的文件系统类型
  10. /proc/interrupts x86架构中的每个IRQ中断数
  11. /proc/iomem 每个物理设备当前在系统内存中的映射
  12. /proc/ioports 一个设备的输入输出所使用的注册端口范围
  13. /proc/kcore 代表系统的物理内存,存储为核心文件格式,里边显示的是字节数,等于RAM大小加上4kb
  14. /proc/kmsg 记录内核生成的信息,可以通过/sbin/klogd或/bin/dmesg来处理
  15. /proc/loadavg 根据过去一段时间内CPU和IO的状态得出的负载状态,与uptime命令有关
  16. /proc/locks 内核锁住的文件列表
  17. /proc/mdstat 多硬盘,RAID配置信息(md=multiple disks)
  18. /proc/meminfo RAM使用的相关信息
  19. /proc/misc 其他的主要设备(设备号为10)上注册的驱动
  20. /proc/modules 所有加载到内核的模块列表
  21. /proc/mounts 系统中使用的所有挂载
  22. /proc/mtrr 系统使用的Memory Type Range Registers (MTRRs)
  23. /proc/partitions 分区中的块分配信息
  24. /proc/pci 系统中的PCI设备列表
  25. /proc/slabinfo 系统中所有活动的 slab 缓存信息
  26. /proc/stat 所有的CPU活动信息
  27. /proc/sysrq-trigger 使用echo命令来写这个文件的时候,远程root用户可以执行大多数的系统请求关键命令,就好像在本地终端执行一样。要写入这个文件,需要把/proc/sys/kernel/sysrq不能设置为0。这个文件对root也是不可读的
  28. /proc/uptime 系统已经运行了多久
  29. /proc/swaps 交换空间的使用情况
  30. /proc/version Linux内核版本和gcc版本
  31. /proc/bus 系统总线(Bus)信息,例如pci/usb等
  32. /proc/driver 驱动信息
  33. /proc/fs 文件系统信息
  34. /proc/ide ide设备信息
  35. /proc/irq 中断请求设备信息
  36. /proc/net 网卡设备信息
  37. /proc/scsi scsi设备信息
  38. /proc/tty tty设备信息
  39. /proc/net/dev 显示网络适配器及统计信息
  40. /proc/vmstat 虚拟内存统计信息
  41. /proc/vmcore 内核panic时的内存映像
  42. /proc/diskstats 取得磁盘信息
  43. /proc/schedstat kernel调度器的统计信息
  44. /proc/zoneinfo 显示内存空间的统计信息,对分析虚拟内存行为很有用

3) /proc目录中进程N的信息

  1. /proc/N pid为N的进程信息
  2. /proc/N/cmdline 进程启动命令
  3. /proc/N/cwd 链接到进程当前工作目录
  4. /proc/N/environ 进程环境变量列表
  5. /proc/N/exe 链接到进程的执行命令文件
  6. /proc/N/fd 包含进程相关的所有的文件描述符
  7. /proc/N/maps 与进程相关的内存映射信息
  8. /proc/N/mem 指代进程持有的内存,不可读
  9. /proc/N/root 链接到进程的根目录
  10. /proc/N/stat 进程的状态
  11. /proc/N/statm 进程使用的内存的状态
  12. /proc/N/status 进程状态信息,比stat/statm更具可读性
  13. /proc/self 链接到当前正在运行的进程

15 Linux系统的日志,都保存在/var/log目录下:

  1. /var/log/boot.log:记录了系统在开机引导过程中(开机自检过程显示在屏幕上)发生的事件
  2. /var/log/lastlog:记录最后一次用户成功登陆的时间、登陆IP等信息
  3. /var/log/messages:记录Linux操作系统常见的系统和服务错误信息
  4. /var/log/secure:Linux系统安全日志,记录用户和工作组变化情况、用户登陆认证情况
  5. /var/log/btmp:记录系统登陆失败的用户、时间以及远程IP地址
  6. /var/log/syslog:只记录警告信息,常常是系统出问题的信息,使用lastlog查看
  7. /var/log/wtmp:该日志文件永久记录每个用户登录、注销及系统的启动、停机的事件,使用last命令查看
  8. /var/run/utmp:该日志文件记录有关当前登录的每个用户的信息。如 who、w、users、finger等就需要访问这个文件
  9. /var/log/syslog或/var/log/messages 存储所有的全局系统活动数据,包括开机信息。基于 Debian 的系统如 Ubuntu 在 /var/log/syslog中存储,而基于RedHat的系统如RHEL或CentOS 则在/var/log/messages 中存储。
  10. /var/log/auth.log或/var/log/secure 存储来自可插拔认证模块(PAM)的日志,包括成功的登录,失败的登录尝试和认证方式。Ubuntu 和 Debian 在/var/log/auth.log 中存储认证信息,而RHEL或CentOS 则在/var/log/secure 中存储。
  11. cat /var/log/secure | awk '/Failed/{print $(NF-3)}' | sort | uniq -c | awk '{print $2" = "$1;}'  #查看发起攻击的IP和攻击次数 

15 wget 参数

    1. wget -c  断点续传,连续下: wget -c ftp://sunsite.doc.ic.ac.uk/ls-lR.Z
    2. wget 限速下载 wget --limit-rate=300k http://www.linuxde.net/testfile.zip
    3. wget -b  wget后台下载 wget -b    http://www.linuxde.net/testfile.zip Continuing in background, pid 1840. Output will be written to `wget-log'

16 查看用户,登录相关

1) 查看用户,组,删除

  1. getent passwd nginx
  2. getent group nginx
  3. userdel -r nginx

2) 创建账号并赋sudo 权限

useradd ansible

passwd ansible

sed -i '$a\ansible ALL=(ALL) NOPASSWD: ALL' /etc/sudoers

如果容许此账号ssh 连接 继续以下操作

vi /etc/ssh/sshd_config

ansible@10.38.46.xx(容许10.38.46.xx 以ansible账号连接此服务器)

service sshd restart 

禁止root登录

vim /etc/ssh/sshd_config 设置为no

17 批量杀死进程

ps aux|grep python|grep -v grep|cut -c 9-15|xargs kill -15
ps aux|grep python|grep -v grep|awk '{print$2}'|xargs kill -15

管道符“|”用来隔开两个命令,管道符左边命令的输出会作为管道符右边命令的输入。下面说说用管道符联接起来的

几个命令:

“ps aux”是linux 里查看所有进程的命令。这时检索出的进程将作为下一条命令“grep python”的输入。

“grep python”的输出结果是,所有含有关键字“python”的进程,这是python程序

“grep -v grep”是在列出的进程中去除含有关键字“grep”的进程。

“cut -c 9-15”是截取输入行的第9个字符到第15个字符,而这正好是进程号PID。

“xargs kill -15”中的xargs命令是用来把前面命令的输出结果(PID)作为“kill -15”命令的参数,并执行该令。

“kill -15”会正常退出指定进程,-9强行杀掉

 

二, 防火墙:

1 背景:

  防火墙,用于实现Linux下访问控制的功能的,分为硬件的或者软件的防火墙两种。无论是在哪个网络中,防火墙工作的地方一定是在网络的边缘。而我们的任务就是需要去定义到底防火墙如何工作,这就是防火墙的策略,规则,以达到让它对出入网络的IP、数据进行检测。 目前市面上比较常见的有3、4层的防火墙,叫网络层的防火墙,还有7层的防火墙,其实是代理层的网关。对于TCP/IP的七层模型来讲,我们知道第三层是网络层,三层的防火墙会在这层对源地址和目标地址进行检测。但是对于七层的防火墙,不管你源端口或者目标端口,源地址或者目标地址是什么,都将对你所有的东西进行检查。所以,对于设计原理来讲,七层防火墙更加安全,但是这却带来了效率更低。所以市面上通常的防火墙方案,都是两者结合的。而又由于我们都需要从防火墙所控制的这个口来访问,所以防火墙的工作效率就成了用户能够访问数据多少的一个最重要的控制,配置的不好甚至有可能成为流量的瓶颈。

2 比较:

  FirewallD(redhat 7)跟iptables比起来,不好的地方是每个服务都需要去设置才能放行,因为默认是拒绝。而iptables里默认是每个服务是允许,需要拒绝的才去限制。

3 策略:

1) 防火墙策略一般分为两种:

  1. 通: 通策略,默认门是关着的,必须要定义谁能进,所以通,是要全通
  2. 堵:大门是洞开的,但是你必须有身份认证,否则不能进。所以我们要定义,让进来的进来,让出去的出去,而堵,则是要选择
  3. 定义策略:要分别定义多条功能:
    1. 定义数据包中允许或者不允许的策略,filter过滤的功能
    2. 而定义地址转换的功能的则是nat选项
    3. 为了让这些功能交替工作,我们制定出了“表”这个定义,来定义、区分各种不同的工作功能和处理方式

2) 常用功能

我们现在用的比较多个功能有3个:

  1. filter 定义允许或者不允许的
  2. nat 定义地址转换的
  3. mangle:修改报文原数据;我们修改报文原数据就是来修改TTL的。能够实现将数据包的元数据拆开,在里面做标记/修改内容的。而防火墙标记,其实就是靠mangle来实现的。

3) 小扩展: 

  1. 对于filter来讲一般只能做在3个链上:INPUT ,FORWARD ,OUTPUT 
  2. 对于nat来讲一般也只能做在3个链上:PREROUTING ,OUTPUT ,POSTROUTING 
  3. 而mangle则是5个链都可以做:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
  4. 规则的次序非常关键,谁的规则越严格,应该放的越靠前,而检查规则的时候,是按照从上往下的方式进行检查的

4 iptables防火墙

1)基本操作

  1. iptables -L  #  列出所有规则
  2. iptables -F    #  清除所规则
  3. iptables -D chain rulenum     # 清除某条   比如 INPUT 里有三条规则,那么 iptables -D INPUT 2 就会删掉第二条
  4. service iptables status / stop  /start  / restart   # 查看防火墙状态
  5. chkconfig iptables off /on # 永久关闭防火墙/永久关闭后重启

2) 开启端口,开启80,3306端口

vi /etc/sysconfig/iptables
-A INPUT -m state –state NEW -m tcp -p tcp –dport 80 -j ACCEPT(允许80端口通过防火墙)
-A INPUT -m state –state NEW -m tcp -p tcp –dport 3306 -j ACCEPT(允许3306端口通过防火墙)
特别提示:很多网友把这两条规则添加到防火墙配置的最后一行,导致防火墙启动失败,正确的应该是添加到默认的22端口这条规则的下面 REJECT 上面

######################################
# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state –state NEW -m tcp -p tcp –dport 22 -j ACCEPT
-A INPUT -m state –state NEW -m tcp -p tcp –dport 80 -j ACCEPT
-A INPUT -m state –state NEW -m tcp -p tcp –dport 3306 -j ACCEPT
-A INPUT -j REJECT –reject-with icmp-host-prohibited
-A FORWARD -j REJECT –reject-with icmp-host-prohibited
COMMIT
#####################################

最后重启防火墙使配置生效
service iptables restart (systemctl  restart iptables) 

查询端口是否有进程守护用如下命令grep对应端口,如80为端口号
netstat -nalp|grep 80

5 firewall防火墙

1) 基本操作

  1. systemctl status firewalld  # 查看firewall服务状态
  2. firewall-cmd --state   # 查看firewall的状态
  3. service firewalld start/restart/stop   # 开启、重启、关闭、firewalld.service服务
  4. firewall-cmd --list-all  # 查看防火墙规则

2)查询、开放、关闭端口

  1. firewall-cmd --query-port=8080/tcp  # 查询端口是否开放
  2. firewall-cmd --permanent --add-port=80/tcp  # 开放80端口
  3. firewall-cmd --permanent --remove-port=8080/tcp  # 移除端口
  4. firewall-cmd --reload  #重启防火墙(修改配置后要重启防火墙)

3) 参数解释

  1. firwall-cmd:是Linux提供的操作firewall的一个工具;
  2. --permanent:表示设置为持久;
  3. --add-port:标识添加的端口;

三. linux 安装package

1 jdk 8

1 查看之前是否安装过:

rpm -qa | grep -i jdk

2 yum安装

yum search java|grep  java-1.8.0-openjdk*

 yum install -y java-1.8.0-openjdk.x86_64

3 查看安装情况

 4 配置环境变量

vim  /etc/profile

 5 加载

source /etc/profile (

如果配置零时环境变量:直接export JAVA_HOME=xxxx)

2 nload 安装

1  wget http://www.roland-riegel.de/nload/nload-0.7.4.tar.gz

2 yum install gcc gcc-c++ ncurses-devel

3 tar zxvf nload-0.7.4.tar.gz

   cd nload-0.7.4

   ./configure

   make

   make install

第二种方法:

wget http://mirrors.kernel.org/fedora-epel/6/i386/epel-release-6-8.noarch.rpm 
rpm -ivh epel-release-6-8.noarch.rpm 
yum install nload

 

3 非root用户上传文件

  1. 可将文件上传大/tmp/ 下,然后cp到相应的目录,任何账号的文件都可以先上传到tmp目录下。
  2. 可以上传到/home/以非root用户命名的目录/

4 修改ssh 22端口

vim /etc/ssh/sshd_config

找到#Port 22,默认是注释掉的,先把前面的#号去掉,再插入一行设置成你想要的端口号,注意不要跟现有端口号重复

Port 22
Port 26580
保存后退出,执行重启命令:service sshd.service restart

新开一个终端窗口测试 26580端口是否可以正常连接服务器,如果成功则将Port 22删除,之所以先设置成两个端口,测试成功后再关闭一个端口,是为了方式在修改conf的过程中,万一出现掉线、断网、误操作等未知情况时候,还能通过另外一个端口连接上去调试以免发生连接不上必须派人去机房,导致问题更加复杂麻烦。

然后使用23456端口登录,看是否可以连接成功,连接成功后在删除22端口.

不过在这有一个问题,一般的linux服务器都有自带的防火墙iptables规则,把端口 26580在规则中设置备放行,有时不需要做此设置

iptables -I INPUT -p tcp --dport  26580  -j ACCEPT
参数 -I 是把上面那条规则插入到iptables规则的最前面,然后删除ssh默认的22端口,保存规则,重启防火墙,到此大功告成。

下面说一下,怎么删除iptables规则,有时候有些规则太长,删除时要写一大串,既浪费时间又容易写错,这时我们可以先使用–line-number查看出该条规则的行号,再通过行号删除,代码如下:

[root@test ~]# iptables -nL --line-number
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 DROP all -- 192.168.1.1 0.0.0.0/0
2 DROP all -- 192.168.1.2 0.0.0.0/0
3 DROP all -- 192.168.1.3 0.0.0.0/0
比如删除第二条规则,输入 :

[root@test ~]# iptables -D INPUT 2

 修改vim 注解颜色

找到vim的配置文件, /etc/vimrc
用vim打开它 vim /etc/vimrc 然后按大写 G 到最后一行,插入 hi comment ctermfg=6 然后wq保存离开

根据端口查看进程路径

netstat -nlp |grep 9092

tcp        0      0 10.10.10.10:9092            0.0.0.0:*                   LISTEN      33863/java

 

然后通过下面命令查询对应的程序路径

 

ll /proc/33863/cwd

lrwxrwxrwx 1 kafka kafka 0 Jun 18 05:14 /proc/33863/cwd -> /var/run/cloudera-scm-agent/process/5052-kafka-KAFKA_BROKER

查看进程使用的端口和端口使用情况

netstat -a 查看所有服务端口
netstat -tln 查看当前使用的端口
 
通过PID查看端口号:netstat -anop|grep pid 
 
ps命令查看进程的id:
ps aux | grep 12345

或者

pidof Name
 
netstat命令查看其占用的端口:
netstat -apn | grep 12345

 统计数量

netstat -apn | grep 12345 | wc -l

查看有哪些链接

lsof -i:21
netstat -tunlp|grep 12345

 

查看端口是否被占用

netstat  -anp  |grep   端口号

 

 

netstat   -nultp(此处不用加端口号)

该命令是查看当前所有已经使用的端口情况

 

获取jvm dump 堆内存

jmap -dump:live,format=b,file=/test-heap.hprof $pid

"jmap -dump:live,format=b,file=/" + filename + " `jps |grep -v Jps | cut -d' ' -f1`"
 

清除memory cache

清空所有缓存(pagecache、dentries 和 inodes):
sync
echo 3 > /proc/sys/vm/drop_caches

flock 文件加锁解锁

linux在多个进程同时操作同一份文件的时候,很容易导致文件混乱,这时候就需要锁,来保证文件的完成性.

flock主要三种操作类型:
     lock_sh,常被用作读共享锁;
     LOCK_EX,只能被一个进行使用,常被用作写锁;
     LOCK_UN,释放锁;
 
posted @ 2020-01-19 14:04  云清拓  阅读(83)  评论(0)    收藏  举报