关于linux运维:Linux系统使用cpulimit对CPU使用率进行限制

介绍cpulimit 是一个限度过程的 CPU 使用率的工具(以百分比示意,而不是以 CPU 工夫示意)。 当不心愿批处理作业占用太多 CPU 时,管制批处理作业很有用。 指标是避免过程运行超过指定的工夫比率。 它不会更改 nice 值或其余调度优先级设置,而是更改实在的 CPU 使用率,而且可能动静且疾速地适应整个零碎负载。 应用的 CPU 数量的管制是通过向过程发送 SIGSTOP 和 SIGCONT POSIX 信号来实现的。 指定过程的所有子过程和线程将共享雷同百分比的 CPU。 源装置【举荐】Centos: yum install cpulimitDebian / Ubuntu: apt-get install -y cpulimit`编译装置cd /tmpwget 'https://sunpma.com/other/oss/cpulimit-1.1.tar.gz'tar cpulimit-1.1.tar.gzcd cpulimit-1.1makecp cpulimit /usr/local/sbin/rm -rf cpulimit*应用实例限度程序名为 xmrig的程序仅应用 60%的CPU使用率,并在后盾始终运行; cpulimit -e xmrig -l 60 -b限度过程号为 10086的程序仅应用 60%的CPU利用率,并在后盾始终运行; cpulimit -p 10086 -l 60 -b限度绝对路径下的软件仅应用 60%的CPU利用率,并在后盾始终运行; cpulimit -e /usr/local/nginx/sbin/nginx -l 60 -b敞开cpulimit后盾过程(勾销所有限度) kill $(pidof cpulimit)应用办法-p--pid=Npid of the process过程的PID-e--exe=FILEname of the executable program file可执行程序文件名-P--path=PATHabsolute path name of the过程的绝对路径名-b--backgroundrun in background后盾运行-l--limit=Npercentage of cpu allowed from 1 up容许的CPU百分比,最低为1%-z--lazyexit if there is no suitable target process如果指标过程退出或无指标过程则终止-h--helpdisplay this help and exit显示帮忙并退出注意事项限度CPU的百分比依照理论的CPU数量而定,比方单核最高为100%,双核最高为200%,三核最高为300%,以此类推即可;ROOT用户能够限度所有的过程,普通用户只能限度用户有权限治理的过程;以上就是 cpulimit 这个小工具的一些根底用法和进阶用法,心愿对大家有所帮忙。 ...

June 5, 2023 · 1 min · jiezi

关于linux运维:Debian系统添加新用户并赋予sudo权限

出于服务器安全性的思考,当xiaoz在新开一台服务器时,通常会创立一个新用户,并授予该用户sudo权限,而后禁用root用户。本文记录并分享了在Debian零碎下执行此操作的办法。 Debian增加新用户间接执行上面的命令即可: # newuser 改成本人的用户名称sudo adduser newuseradduser命令是Debian系独有的(包含Ubuntu),在Redhat系下不存在该命令。执行该命令会主动创立用户、用户组和家目录,并要求设置用户明码和名称等信息。 赋予sudo权限局部Debian零碎可能默认没有装置sudo命令,能够执行上面的命令先进行装置(须要root用户操作): apt-get install sudo装置结束后执行上面的命令将新用户增加到sudo组(须要root用户操作),以便他们能够取得管理员权限。 # newuser改成你上一步骤中的用户名usermod -aG sudo newuser测试接下来切换到newuser,而后测试sudo是否失常。 # 切换到newusersu - newuser# 测试sudo权限,如果没有报错,阐明失常sudo pwd结语在Debian系下新建用户并赋予sudo权限都非常简单。只需应用几个命令即可实现,与Redhat系相比,不须要批改配置文件,更加不便。 此文章首发于我的独立博客:https://blog.xiaoz.org/archives/18678

May 6, 2023 · 1 min · jiezi

关于linux运维:快速解决-Linux-内核问题一站式运维工具-ocops-介绍

导读:明天,Linux 内核治理曾经成为古代计算机领域中不可或缺的一部分。然而,因为问题简单多样,解决起来也须要更加业余的常识和教训。而且,因为各种运维工具扩散、入口不对立、治理不零碎,局部工具参数和子命令数量宏大,对于一般运维人员应用来说十分艰难。 为了进步运维效率,OpenCloudOS 运维工具 SIG 开发了 oc-ops,作为一款一站式 OS 运维工具集,它能够帮忙用户更好地对立、系统地治理运维工具,并晋升相干问题的定位效率。本文将具体介绍 oc-ops 的性能和劣势,让读者更全面地理解这个工具集的重要性。 一、开发背景在治理 Linux 内核时,开发者经常面临着很多问题,比方定位 TCP 协定栈中导致数据包失落的环节,这些问题可能须要业余的常识和教训能力解决。还有些场景不足必要的工具来解决问题,甚至有时即便有相应的工具,也很难应用。 另外一个问题是,运维工具扩散、入口不对立、治理不零碎,没有一个工具或平台可能为所有的问题提供解决方案,并且没有对立的入口或集中的形式来应用和治理这些工具。 例如,blktrace、blkparse 和 btt 等磁盘 IO 监测工具生成的数据量微小,人工从中找出超过工夫阈值的 IO 申请十分耗时。局部工具的参数和子命令数量达到数百个,对于一般的运维人员来说学习应用须要破费大量的工夫。 为了解决这些问题,OpenCloudOS 运维工具 SIG 开发了一款一站式 OS 运维工具集——oc-ops,它将开发和运维人员的专业知识通过工具进行固化和传承,并自主研发了一些子命令来补全相干工具。 oc-ops 能够帮忙对立、系统地治理运维工具,从而进步运维效率。无论你是 Linux 开发人员,还是系统管理员,oc-ops 都能够帮忙你更高效地解决各种问题。 二、oc-ops 语法格局1、根本语法格局Usage: oc-ops [opt] <subcmd> [opt] [cmdargs] oc-ops [opt] 反对的参数: oc-ops -h:查看 oc-ops 用法,将列出 oc-ops 反对的所有 subcmd。    oc-ops -v:查看 oc-ops 的版本号。    oc-ops -d:以调试模式运行 oc-ops,不便 oc-ops 命令本身问题的定位。为便于应用、使 oc-ops 易于上手,oc-ops 采纳如下策略: 反对 tab 键主动扩大/补全的性能。限度子命令参数的个数,尽量采纳自然语言代替参数(利用下面的主动扩大放慢输入速度)。命令级数临时限定在 4 级。       2、子命令用法通过 oc-ops <subcmd> -h,可查看每个子性能的具体用法。 ...

March 21, 2023 · 2 min · jiezi

关于linux运维:如何在后台运行-Linux-Shell-命令-脚本

在 Linux 终端上执行命令的通常只需运行它,而后期待它优雅地退出即可。一旦命令退出,您能够继续执行其余命令,这就是所谓的前台中的运行命令。顾名思义,您能够在终端上看到命令的输入。 然而,有时在前台运行命令会带来一系列挑战。该命令可能须要很长时间能力退出,可能会节约您贵重的工夫,它可能齐全依赖于 shell 会话,让你陷入困境。 在这种状况下,在后盾运行命令是最好的抉择。当您在前台并发地执行其余命令时,能够将一个(多个) 命令发送到后盾。这进步了在终端上工作的效率,节俭了您的工夫。 在本指南中,咱们关注如何在后盾运行 Linux shell 命令或脚本。 在后盾应用“&”符号运行 shell 命令要在后盾运行命令或脚本,请在开端用&号完结它,如下所示 $ command & 留神: 以&号完结命令并不会将该命令与您拆散。它只是将它发送到您正在应用的以后 shell 的后盾,该命令依然将输入打印到 STDOUT 或 STDERR,这将阻止您在终端上执行其余命令。 一种更好的办法是将命令重定向到 /dev/null,而后在开端附加 & 符号,如下所示 $ command &>/dev/null & 要确认命令被发送到后盾,运行 jobs 命令 如果须要终止后盾过程,执行 kill 命令,前面跟着过程的 PID,选项 -9 将立刻终止过程。 $ kill -9 138314 应用 nohup 命令在后盾运行 shell 命令或脚本在后盾运行命令的另一种办法是应用 nohup 命令。nohup 命令是 no hang up 的缩写,它是一个命令,即便在退出 shell 后也能放弃过程运行。 它通过阻止过程接管 SIGHUP (信号挂起) 信号来做到这一点,这个信号通常是在过程退出终端时发送给过程的。 要在后盾发送命令或脚本并放弃其运行,请应用以下语法: $ nohup command &>/dev/null & ...

December 26, 2022 · 1 min · jiezi

关于linux运维:记一次异地备份项目服务器TOP命令卡死

状况阐明理解到服务器TOP命令卡死,无奈通过Ctrl+C或者其余任何命令完结过程. 谬误排查应用普通用户登录操作系统,失常登陆查看df -h命令失常ls top等命令卡死su到root用户,尝试应用上述命令,依然卡死应用ls查看根目录下/etc/fstab文件,查看无额定挂载点未挂载经排查,在非/目录下,应用上述任意命令均为失常.狐疑/目录下有文件系统未失常挂载尝试应用mount -l命令,夯死尝试cat /etc/mtab文件,夯死尝试cat/proc/mounts文件,夯死strace命令进行跟踪,提醒如下execve("/usr/bin/ls", ["ls"], [/* 22 vars */]) = 0brk(NULL) = 0x1475000mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f3a2c6ce000access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC理解到最近网络上批改过一些配置,加上了VxLAN造成起因在根目录下,ls top等命令基本上都是内容比拟多,数据包比拟大 基本上都吃满了1500这个默认值加上VxLAn的包 大于1500 封装之后堡垒机辨认不了出现给用户就是夯死了解决计划调整操作系统mtu值,将服务器操作系统数据包调小,加上VxLAN数据包小于1500即可

November 2, 2022 · 1 min · jiezi

关于linux运维:Deepin系统navicat15安装

Deepin零碎装置navicat15(已验证)下载Navicat15通过上面地址下载Navicat15,默认下载到桌面即可 $ https://download.navicat.com.cn/download/navicat15-premium-cs.AppImage而后右键Open with抉择 Archive Manager解压到桌面的navicat15-premium-cs-bak文件夹 $ mv navicat15-premium-cs/ ~/Desktop/temp/navicat15-premium-cs-bak装置依赖包$ sudo apt install libcapstone-dev cmake rapidjson-dev openssl git装置keystonegit拉取keystone$ git clone https://github.com/keystone-engine/keystone.git编译keystone$ mkdir -pv ~/Desktop/temp/keystone/build$ cd ~/Desktop/temp/keystone/build$ ../make-share.sh这一步可能会报上面谬误 CMake Deprecation Warning at CMakeLists.txt:4 (cmake_minimum_required): Compatibility with CMake < 2.8.12 will be removed from a future version of CMake. Update the VERSION argument <min> value or use a ...<max> suffix to tell CMake that the project does not need compatibility with older versions.-- The C compiler identification is GNU 8.3.0-- The CXX compiler identification is unknown-- Detecting C compiler ABI info-- Detecting C compiler ABI info - done-- Check for working C compiler: /usr/bin/cc - skipped-- Detecting C compile features-- Detecting C compile features - doneCMake Error at CMakeLists.txt:5 (project): No CMAKE_CXX_COMPILER could be found. Tell CMake where to find the compiler by setting either the environment variable "CXX" or the CMake cache entry CMAKE_CXX_COMPILER to the full path to the compiler, or to the compiler name if it is in the PATH. -- Configuring incomplete, errors occurred!See also "/home/liang/Desktop/keystone/build/CMakeFiles/CMakeOutput.log".See also "/home/liang/Desktop/keystone/build/CMakeFiles/CMakeError.log".解决办法 ...

September 27, 2022 · 2 min · jiezi

关于linux运维:Linux定时任务cron服务

应用3A服务器搭建centos零碎crond 服务详解cron 是 Linux 下用来周期性的执行某种工作或期待解决某些事件的一个守护过程,能够在无需人工干预的状况下运行作业。 装置 crond 服务 yum install croniecrond服务启动 systemctl start crondsystemctl enable crondcrond服务解析Linux系统调度能够分为两类: 零碎任务调度 | 用户任务调度(1) 零碎任务调度: 零碎周期性所要执行的工作,比方写缓存数据到硬盘、日志清理等 crond服务在/etc/目录下有一个crontab文件,这个文件就是零碎任务调度的配置文件。 配置文件内容解析 [root@dev etc]# vim /etc/crontabSHELL=/bin/bash # 指定shellPATH=/sbinL:/bin:/usr/sbin:/usr/bin # 指定了零碎可执行文件门路MAILTO=root # 指定了crond的工作执行信息将通过电子邮件发送给root用户,如果MAILTO变量的值为空,则示意不发送工作 执行信息给用户。HOME=/ # 指定执行命令或脚本时应用的主目录(2) 用户任务调度: 用户定期要执行的工作,比方用户数据备份、定时邮件揭示等用户能够应用 crontab 工具来定制本人的打算工作。所有用户定义的crontab 文件都被保留在 /var/spool/cron目录中。其文件名与用户名统一。 能够通过 crontab 命令增加或者编辑须要定时执行的工作crontab 命令基本参数crond 服务提供 crontab 命令用于设置 crond 服务 crontab -u //设定某个用户的cron服务,个别root用户在执行这个命令的时候须要此参数 crontab -l //列出某个用户cron服务的具体内容 crontab -r //删除某个用户的cron服务 crontab -e //编辑某个用户的cron服务特殊字符 : 代表所有可能的值, :用逗号隔开的值示意一个范畴列表,如 1,2 示意1-2:能够在整数两头用中杠示意一个整数范畴,如 6-8 , 示意6 7 8/ : 能够用正斜线示意工夫距离频率,如 /10 用于minute字段,示意每10分钟执行一次。增加定时工作工作格局: M(分) H(时) D(日) m(月) d(周) command ...

September 6, 2022 · 1 min · jiezi

关于linux运维:操作服务器的神奇工具Tmux

Tmux 是什么?会话与过程命令行的典型应用形式是,关上一个终端窗口(terminal window,以下简称"窗口"),在外面输出命令。用户与计算机的这种长期的交互,称为一次"会话"(session) 。 会话的一个重要特点是,窗口与其中启动的过程是连在一起的。关上窗口,会话开始;敞开窗口,会话完结,会话外部的过程也会随之终止,不论有没有运行完。 Tmux 的作用Tmux 就是会话与窗口的"解绑"工具,将它们彻底拆散。 它容许在单个窗口中,同时拜访多个会话(这对于同时运行多个命令行程序很有用)它能够让新窗口"接入"曾经存在的会话。它容许每个会话有多个连贯窗口,因而能够多人实时共享会话。它还反对窗口任意的垂直和程度拆分。根本用法装置# Ubuntu 或 Debian$ sudo apt-get install tmux# CentOS 或 Fedora$ sudo yum install tmux# Mac$ brew install tmux启动与退出装置实现后,键入tmux命令,就进入了 Tmux 窗口。 下面命令会启动 Tmux 窗口,底部有一个状态栏。状态栏的左侧是窗口信息(编号和名称),右侧是零碎信息。 按下Ctrl+d或者显示输出exit命令,就能够退出 Tmux 窗口。 $ exit前缀键Tmux 窗口有大量的快捷键。所有快捷键都要通过前缀键唤起。默认的前缀键是Ctrl+b,即先按下Ctrl+b,快捷键才会失效。 举例来说,帮忙命令的快捷键是Ctrl+b ?。它的用法是,在 Tmux 窗口中,先按下Ctrl+b,再按下?,就会显示帮忙信息。 而后,按下 ESC 键或q键,就能够退出帮忙。 会话治理新建会话第一个启动的 Tmux 窗口,编号是0,第二个窗口的编号是1,以此类推。这些窗口对应的会话,就是 0 号会话、1 号会话。 应用编号辨别会话,不太直观,更好的办法是为会话起名。 $ tmux new -s <session-name>下面命令新建一个指定名称的会话。 拆散会话在 Tmux 窗口中,按下Ctrl+b d或者输出tmux detach命令,就会将以后会话与窗口拆散。 与Ctrl+d的区别:Ctrl+d是完结以后会话,相当于kill;拆散是切换到非tmux窗口,会话仍然存活。$ tmux detach下面命令执行后,就会退出以后 Tmux 窗口,然而会话和外面的过程依然在后盾运行。 列出会话tmux ls命令能够查看以后所有的 Tmux 会话(仅在非tmux窗口失效) ...

September 2, 2022 · 2 min · jiezi

关于linux运维:Linux面试最高频的5个基本问题

CPU利用率和CPU负载的区别是什么 提到CPU利用率,就必须了解工夫片。什么是CPU工夫片?咱们当初所应用的Windows、Linux、Mac OS都是“多任务操作系统”,就是说他们能够“同时”运行多个程序,比方一边关上Chrome浏览器浏览网页还能一边听音乐。 然而,实际上一个CPU内核在同一时刻只能干一件事,那操作系统是如何实现“多任务”的呢?大略的办法是让多个过程轮流应用CPU一小段时间,因为这个“一小段时间”很短(在linux上为5ms-800ms之间),用户感觉不到,就如同是几个程序同时在运行了。下面提到的“一小段时间”就是咱们所说的CPU工夫片,CPU的古代分时多任务操作系统对CPU都是分工夫片应用的。 CPU使用率,就是程序对CPU工夫片的占用状况,即CPU使用率 = CPU工夫片被程序应用的工夫 / 总工夫。比方A过程占用10ms,而后B过程占用30ms,而后闲暇60ms,再又是A过程占10ms,B过程占30ms,闲暇60ms,如果在一段时间内都是如此,那么这段时间内的CPU占用率为40%。CPU利用率显示的是程序在运行期间实时占用的CPU百分比。 大多数操作系统的CPU占用率分为用户态CPU使用率和零碎态CPU使用率。用户态CPU使用率是指执行利用程序代码的工夫占总CPU工夫的百分比。相比而言,零碎态CPU使用率是指利用执行操作系统调用的工夫占总CPU工夫的百分比。零碎态的CPU使用率高意味着共享资源有竞争或者I/O设施之间有大量的交互。 而CPU负载显示的是一段时间内正在应用和期待应用CPU的均匀工作数。 简略了解,一个是CPU的实时应用状况,一个是CPU的以后以及将来一段时间的应用状况。举例来说:如果我有一个程序它须要始终应用CPU的运算性能,那么此时CPU的使用率可能达到100%,然而CPU的工作负载则是趋近于“1”,因为CPU仅负责一个工作嘛!如果同时执行这样的程序两个呢?CPU的使用率还是100%,然而工作负载则变成2了。所以也就是说,CPU的工作负载越大,代表CPU必须要在不同的工作之间进行频繁的工作切换。无论CPU的利用率是高是低,跟前面有多少工作在排队(CPU负载)没有必然关系。 如果单核CPU的话,负载达到1就代表CPU曾经达到满负荷的状态了,超过1,前面的进行就须要排队期待解决了。如果是是多核多CPU,假如当初服务器是2个CPU,每个CPU有2个核,那么总负载不超过4都没什么问题。 能够通过uptime、w命令查看CPU均匀负载,应用top命令还能看到CPU负载总体使用率以及各个过程占用CPU的比例。 查看物理CPU个数 cat /proc/cpuinfo| grep “physical id”| sort | uniq| wc -l 查看每个物理CPU中core的个数(即核数) cat /proc/cpuinfo| grep “cpu cores” | uniq 查看逻辑CPU的个数 cat /proc/cpuinfo| grep “processor”| wc -l 如果CPU负载很高,利用率却很低该怎么办  CPU负载很高,利用率却很低,阐明处于期待状态的工作很多,负载越高,代表可能很多僵死的过程。通常这种状况是IO密集型的工作,大量工作在申请雷同的IO,导致工作队列沉积。 生产环境造成CPU利用率低负载高的具体场景常见的有如下几种。 场景一:磁盘读写申请过多就会导致大量I/O期待 过程在cpu下面运行须要拜访磁盘文件,这个时候cpu会向内核发动调用文件的申请,让内核去磁盘取文件,这个时候cpu会切换到其余过程或者闲暇,这个工作就会转换为不可中断睡眠状态。当这种读写申请过多就会导致不可中断睡眠状态的过程过多,从而导致负载高,cpu低的状况。 场景二:MySQL中存在没有索引的语句或存在死锁等状况 咱们都晓得MySQL的数据是存储在硬盘中,如果须要进行sql查问,须要先把数据从磁盘加载到内存中。当在数据特地大的时候,如果执行的sql语句没有索引,就会造成扫描表的行数过大导致I/O阻塞,或者是语句中存在死锁,也会造成I/O阻塞,从而导致不可中断睡眠过程过多,导致负载过大。 同样,能够先通过top命令察看,假如发现当初的确是高负载低使用率。 而后,再通过命令ps -aux查看是否存在状态为D的过程,这个状态指的就是不可中断的睡眠状态的过程。处于这个状态的过程无奈终止,也无奈自行退出,只能通过复原其依赖的资源或者重启零碎来解决。以下图中没有D状态的过程。 Linux上过程的五种状态 R (TASK_RUNNING):可执行状态,只有在该状态的过程才可能在CPU上运行。而同一时刻可能有多个过程处于可执行状态。 S (TASK_INTERRUPTIBLE):可中断的睡眠状态,处于这个状态的过程因为期待某某事件的产生(比方期待socket连贯、期待信号量),而被挂起。 D (TASK_UNINTERRUPTIBLE):不可中断的睡眠状态,过程处于睡眠状态,然而此刻过程是不可中断的。TASK_UNINTERRUPTIBLE状态存在的意义就在于,内核的某些解决流程是不能被打断的。 T (TASK_STOPPED or TASK_TRACED):暂停状态或跟踪状态。Z (TASK_DEAD - EXIT_ZOMBIE):退出状态,过程成为僵尸过程。过程已终止,但过程形容还在,直到父过程调用wait4()零碎调用后开释。 如果CPU负载很低,利用率却很高该怎么办 这示意CPU的工作并不多,然而工作执行的工夫很长,大概率就是你写的代码自身有问题,通常是计算密集型工作,生成了大量耗时短的计算工作。 怎么排查?间接top命令找到CPU使用率最高的过程,定位到去看看就行了。如果代码没有问题,那么过段时间CPU使用率就会降落的。往期面试题汇总:250期面试材料 CPU利用率达到100%怎么排查问题 1、通过top找到CPU占用率高的过程 2、通过top -Hp pid命令查看CPU占比靠前的线程ID 3、再把线程ID转化为16进制,printf “0x%x\n” 74317,失去0x1224d 4、通过命令jstack 72700 | grep ‘0x1224d’ -C5 --color找到有问题的代码 ...

September 1, 2022 · 1 min · jiezi

关于linux运维:Linux文本编辑器vim详解

零.前言本篇次要介绍Linux下文本编辑器vim的应用办法,以及sudo命令的实现。我应用3A服务器近程连贯的centos71.什么是vim在windows零碎下,咱们应用VS来编写代码,编译代码,调试代码,运行代码等,甚至还能够进行公布代码并进行代码关系的保护。这是因为微软曾经将实现这些性能的工具全副都打包放入VS编译器中了。而在Linux零碎中,并没有这种集万般武艺于一身的货色,咱们编写代码,编译代码,调试代码等性能的实现是由不同的程序来实现的。其中,vim就属于文本编辑器,是能够编写代码的,然而不能调试代码,也不能执行代码。晚期的Linux编辑器应用的是vi进行文本的编辑,vi与vim的关系相似C于C++的关系。2.配置vim环境(1)手动配置要进行手动配置咱们还须要学一些vim指令的常识,这里先作为理解,看文章前面局部就能够了解了。首先在咱们本人的文件夹下建设一个名为.vimrc的文件。建设之后咱们能够vim进入这个文件,而后以插入模式向其中输出配置vim格局的命令即可。(2)白嫖配置这里给大家举荐一个配置程序:gitforcpp这是一个在gitee上收费的开源我的项目,只须要在gitee上搜寻gitforcpp进入后下拉页面,找到这段安装程序: 将其复制后,在以后用户的文件夹下粘贴,而后间接回车即可,零碎会主动装置配置。留神,以后用户对vim的配置只对以后用户失效,对其余用户是不失效的。3.vim的三种模式以及切换留神,本文中shift示意常按。vim一共有四种模式,别离是命令模式,插入模式,底行模式以及替换模式,替换模式咱们尽量当成一种性能去应用,因而这里次要介绍三种模式,曾经足够。当咱们间接输出vim时,显示的是以后vim的版本信息: 咱们须要建设一个文件能力关上文件,比方建设一个test.txt文件,而后用vim关上它:touch test.txtvim test.txt 关上后咱们会进入一个空白的文本界面。目前咱们所处的模式叫做命令模式。如果咱们想退出vim就须要先进入底行模式:shift+:。而后再输出q而后回车,即可退出vim。从底行模式进入命令模式能够通过Esc键。咱们发现咱们当初是不能写入内容的,须要进入插入模式能力书写内容,此时须要输出i,即进入插入模式。当输出i时,咱们发现上面呈现了INSERT的字样。同时咱们也能够通过Esc键退出插入模式进入命令模式。留神:只有当进入底行模式的时候能力退出vim,如果以后处于插入模式,那么就须要先进入命令模式,再进入底行模式,能力退出vim。插入模式和底行模式必须通过命令模式进行互相转换。上面用一张图来示意三者的关系:4.命令模式(1)光标地位上下左右挪动光标咱们能够应用键盘上的上下左右键来挪动光标,然而不倡议这样做,因为在最后的键盘是没有上下左右键的,咱们应用HJKL来代替上下左右键。上面给出记忆办法。H:左,四个键中最左侧。J:下,联想jump是向下跳。K:上,联想king是居高临下的。L:右,四个键中最右侧。光标锚点地位shift+^:跳转到光标所在行行首。shift+$:跳转到光标所在行行尾。gg:跳转到起始行。shift+g:跳转到完结行。n+shift+g:跳转到第n行。b:以单词为单位,光标向前挪动。w:以单词为单位,光标向后挪动。有人说,间接用鼠标不香吗,小我的项目还好,如果遇到大我的项目好几千行代码,间接命令操作会更加容易一些,因而vim就是为解决大我的项目而生的。进入插入模式i:光标地位不变。a:光标向前移动一位。o:光标新开启一行。(2)文本操作yy:复制以后行。nyy:复制以后行以及以后行后的n-1行。p:光标所在行后所有行后退一行,粘贴到光标所在行的下一行。np:一次反复粘贴n行。u:撤销(相似ctrl z)。ctrl+r:撤销最近的撤销。dd:删除并复制以后行(dd与p连用就是剪切操作)。ndd:删除并复制以后行即后n-1行。shift(按住)+一直按~:逐个扭转大小写。shift(按住)+~(按住):扭转一行的大小写。x:删除光标后的一个字符,反对nx(从左向右删)。shift+x:删除光标前的一个字符,反对n(shift+x)(从右向左删)。r:字符替换,eg.r+b的意思是将一个字符替换成b,反对nr即5r+x示意的是将5个字符替换成x。shift+r:进入替换模式,输出内容后笼罩之后的内容,按Esc退出。5.底行模式在命令模式下输出shift+:进入底行模式。进入底行模式后咱们会发现咱们输出的指令都会显示在最底行。留神,每一次输出指令后回车后须要从新输出shift+:能力持续输出指令。set nu:调出行号。set nonu:敞开行号。vs 文件名:分屏操作ctrl+ww:光标多屏跳转,光标在哪个文件指令对哪个文件失效。(留神要在命令模式下应用该命令)w:保留,w!示意强制保留。q:退出,q!示意强制退出。wq:保留并退出。wq!示意强制保留并退出。6.vim增加sudo指令在root用户下vim在 /etc/sudoers地位处。上面就能够解决如何增加sudo命令了。vim /etc/sudoers 关上后在100行,模拟root增加本人的用户名即可,这里我增加的是lhb。示意信赖lhb这个用户。咱们就能够应用sudo指令了。

September 1, 2022 · 1 min · jiezi

关于linux运维:Linux基础系统管理

二、系统管理1.零碎信息、硬件资源(1).CPUCPU是操作系统稳固运行的基本,CPU的速度与性能在很大水平上决定了零碎整体的性能,因而,CPU数量越多、主频越高,服务器性能也就绝对越好 # 1,查看物理CPU个数$ cat /proc/cpuinfo |grep "physical id"|sort |uniq|wc -l# 2,查看逻辑cpu个数$ cat /proc/cpuinfo |grep "processor"|wc -l# 3,查看CPU多少核$ cat /proc/cpuinfo # 4,动静查看cpu等信息(输出 top 命令之后再按数字 1 )$ top(2).内存Linux零碎采纳了物理内存和虚拟内存(SWAP内存)两种形式,虚拟内存尽管能够缓解物理内存的有余,然而占用过多的虚拟内存,应用程序的性能将显著降落,要保障应用程序的高性能运行,物理内存肯定要足够大;所以咱们在搭建大数据集群的时候个别会禁用SWAP内存分区。 (3).磁盘1).磁盘信息和网络信息的查看# 检测磁盘空间(通过-h参数转成带单位的显示方式:): $ df -h# 显示所有文件系统的磁盘应用状况:$ df -a# 显示各指定文件系统的磁盘空间应用状况:$ df -t# du命令用于统计目录或文件所占磁盘空间的大小:$ du -h /root# 查看以后网络信息: $ ifconfig# 测试近程主机的连通性: $ ping 10.30.59.130# 查问指定目录中文件大小超过500M的find / -type f -size +500M 2).磁盘I/O性能磁盘的I/O性能会间接影响应用程序的性能,尤其是在一个频繁读写的利用中,如磁盘I/O得不到满足,就会导致利用停滞。常见的进步磁盘I/O的形式是应用磁盘RAID技术(便宜磁盘冗余阵列): RAID 0 : 通过把多块硬盘粘合成一个容量更大的硬盘组,进步了磁盘的性能和吞吐量。这种形式成本低,要求至多两个磁盘,然而没有容错和数据修复性能,因此只能用在对数据安全性要求不高的环境中。RAID 1 : 也就是磁盘镜像,通过把一个磁盘的数据镜像到另一个磁盘上,最大限度地保障磁盘数据的可靠性和可修复性,具备很高的数据冗余能力,但磁盘利用率只有50%,因此,老本最高,多用在保留重要数据的场合。RAID 5 : 采纳了磁盘分段加奇偶校验技术,从而进步了系统可靠性,RAID 5读出效率很高,写入效率个别,至多须要3块盘。容许一块磁盘故障,而不影响数据的可用性。(4),查看GPU的版本# 实用于英伟达的gpu显卡nvidia-smi(5),查看Linux的版本信息# 办法1:登陆Linux,在终端输出 cat /etc/redhat-release # 办法2:登陆Linux,在终端输出 cat /etc/issue# 办法3:登陆Linux,在终端输出## 此时须要yum装置yum install redhat-lsb -y## 查看版本等信息lsb_release -a2.过程信息、主机治理1.查看过程信息(3种): (1),查看过程的具体情况:ps (2),显示终端上所有的过程,包含其余用户的过程:ps -a (3),显示过程的具体状态:ps -u (4),查看过程(查看redis的过程):ps -ef | grep redis (5),动态显示过程(top命令用来动态显示运行中的过程。top命令可能在运行后,在指定的工夫距离更新显示信息。能够在应用top命令时加上-d 来指定显示信息更新的工夫距离。):top (6),在kali中没有体现,然而也能够查看过程的详细信息:ntop (7).netstat -anp | grep 过程号 # 查看该过程网络信息 (8).netstat -nlp | grep 端口号 # 查看网络端口号占用状况2.杀死过程(依据查看的过程信息中的pid号(数字)进行删除): 一般杀:kill 232 强制杀:kill -9 2323.关机: 立即关机:shutdown -h now 指定在某个工夫(20:20)点关机:shutdown -h 20:204.重启: rebootps 选项含意-a显示终端上的所有过程,包含其余用户的过程-u显示过程的具体状态-x显示没有管制终端的过程-w显示加宽,以便显示更多的信息-r只显示正在运行的过程 ...

August 3, 2022 · 5 min · jiezi

关于linux运维:Linux基础文件管理

一、文件治理目前服务器端的支流文件系统是:ext4与xfs; df -T 查看磁盘的格式化的格局,支流个别是 xfs 和ext4,系统盘默认是xfs,后续增加数据盘尽量也是xfs格局这样对立比拟好,也不便写脚本批量挂盘。 1.文件操作(1.1),查看文件列表:ls# 1.查看文件的详细信息: $ ls -l# 2.查看文件的详细信息并以人性化的形式展示(k/M/G): $ ls -lh# 3.查看所有的文件(包含暗藏文件): $ ls -a# 4.查看所有文件的详细信息: $ ls -al# 5.查看所有文件的详细信息并以人性化的形式展示(k/M/G): $ ls -alh# 6.帮忙查问命令: $ ls --help# 7.分屏显示文件列表: $ more ls 图详解(1).第1个字母代表文件的类型:“d” 代表文件夹、“-” 代表一般文件、“c” 代表硬件字符设施、“b” 代表硬件块设施、“s”示意管道文件、“l” 代表软链接文件。 (2).后 9 个字母别离代表三组权限:文件所有者、用户组、其余用户领有的权限。(3).文件的硬链接数(4).文件的拥有者(5).文件的领有组(6).文件的大小(7).文件的批改工夫(8).文件名 (1.2).通配符命令(含通配符)含意*文件代表文件名中所有字符ls am*查找以am结尾的文件ls *html查找结尾为html的文件?代表文件名中任意一个字符ls ?.c只找第一个字符任意,后缀为.c的文件ls a.?只找只有3个字符,前2字符为a.,最初一个字符任意的文件[][”和“]”将字符组括起来,示意能够匹配字符组中的任意一个。“-”用于示意字符范畴。[abc]匹配a、b、c中的任意一个[a-f]匹配从a到f范畴内的的任意一个字符(2),输入重定向:# 1.将查问进去的目录名输入到指定文件中(从新并笼罩之前的,如果不存在则创立):$ ls > xxx.txt# 2.将查问进去的目录名输入到指定文件中(在之前的根底上追加,如果不存在则创立):$ ls >> xxx.txt(3),文件的创立、查看、删除# 1.创立一个空文件: $ touch xxx.txt# 2.查看文件的内容: $ cat xxx.txt# 3.查看文件的内容并显示行号: $ cat -b xxx.txt# 4.合并文件内容到一个新的文件中(源文件不删除): $ cat xxx1.txt xxx2.txt > xxx.txt# 5.删除一个文件: $ rm xxx.txtrm 参数含意-i以进行交互式形式执行-f强制删除,疏忽不存在的文件,无需提醒-r递归地删除目录下的内容,删除文件夹时必须加此参数(4),管道(一个命令的输入能够作为管道作为另一个命令的输出):$ ls -alh | more(5),为两个文件建设连贯(须要指明源文件名和连贯文件名):# 1.软连贯: 当原始文件被删除,以后软连贯文件则不能被拜访$ ln -s xxx.txt soft_xxx.txt# 2.硬链接: 即便原始的文件被删除,以后硬链接文件依然能够拜访$ ln xxx.txt hard_xxx.txt(6),文件的查找# find命令性能十分弱小,通常用来在特定的目录下搜寻符合条件(应用正则表达式)的文件,也能够用来搜寻特定用户属主的文件。# 1.查找/etc目录下的所有文件中含有"root"的:$ find /etc -name "root"# 2.查找/etc目录下的所有文件中"root"结尾的:$ find /etc -name "^root"# 3.查找/etc目录下的所有文件中"root"结尾的:$ find /etc -name "root$"命令含意find ./ -name test.sh查找当前目录下所有名为test.sh的文件find ./ -name '*.sh'查找当前目录下所有后缀为.sh的文件find ./ -name "[A-Z]*"查找当前目录下所有以大写字母结尾的文件find /tmp -size 2M查找在/tmp 目录下等于2M的文件find /tmp -size +2M查找在/tmp 目录下大于2M的文件find /tmp -size -2M查找在/tmp 目录下小于2M的文件find ./ -size +4k -size -5M查找当前目录下大于4k,小于5M的文件find ./ -perm 777查找当前目录下权限为 777 的文件或目录(7),文本文件的内容搜寻,也能够在通道之后搜寻:grep选项含意-v显示不蕴含匹配文本的所有行(相当于求反)-n显示匹配行及行号-i疏忽大小写# grep命令是文本搜寻工具,grep容许对文本文件进行模式(通过指定正则表达式)查找。如果找到匹配模式,grep打印蕴含模式的所有行。# grep [-选项] ‘搜寻内容串’文件名# 1.搜寻以a结尾的行: $ grep "^a" 1.txt# 2.搜寻以a结尾的行: $ grep "a$" 1.txt3.匹配[]里中一系列字符中的任意一个: $ grep "[a-g]kk" 1.txt(8),文件的拷贝和挪动# cp命令的性能是将给出的文件或目录复制到另一个文件或目录中1.拷贝文件到a门路下: 1)间接复制不提醒: $ cp 1.txt a 2)显示拷贝进度:cp 1.txt a -v 3)曾经存在的指标文件不提醒:cp 1.txt a -f2.拷贝文件夹a到文件夹b中(不存在则创立): cp a b -r# 用户能够应用mv命令来挪动文件或目录,也能够给文件或目录重命名。3.挪动文件到a门路下: mv 1.txt /a -v4.挪动文件夹a到文件夹b中(不存在则创立): mv a b -v5.批改文件名: mv 1.txt 2.txt选 项含意-a该选项通常在复制目录时应用,它保留链接、文件属性,并递归地复制目录,简略而言,放弃文件原有属性。-f曾经存在的指标文件而不提醒-i交互式复制,在笼罩指标文件之前将给出提醒要求用户确认-r若给出的源文件是目录文件,则cp将递归复制该目录下的所有子目录和文件,指标文件必须为一个目录名。-v显示拷贝进度(9),文件的压缩与解压缩# tar应用格局 tar [参数] 打包文件名 文件1.打包文件:tar -cvf xxx.tar *.txt解压文件:tar -xvf xxx.tar2.打包并压缩文件(.tar.gz):tar -zcvf xxx.tar.gz *.txt解压缩文件(.tar.gz):tar -zxvf xxx.tar.gz3.打包并压缩文件(.tar.bz2):tar -jcvf xxx.tar.bz2 *.txt解压缩文件(.tar.bz2):tar -jxvf xxx.tar.bz24.打包并压缩文件(.tar.zip):zip xxx.zip *.txt解压缩文件(.tar.zip):unzip xxx.zip5.解压到指定门路:tar -zxvf xxx.tar.gz -C /a参数含意-c生成档案文件,创立打包文件-v列出归档解档的具体过程,显示进度-f指定档案文件名称,f前面肯定是.tar文件,所以必须放选项最初-t列出档案中蕴含的文件-x解开档案文件(10),文件的权限治理1,批改文件的所有者: 应用办法:chown 用户名 文件或目录名 sudo chown demo xxx.txt2,批改文件的所在组: 应用办法:chgrp 用户组名 文件或者目录名 chgrp demo xxx.txt3,批改文件的权限: (1).字母法:chmod u/g/o/a +/-/= rwx 文件 u:user 示意该文件的所有者 g:group 示意与该文件的所有者属于同一组( group )者,即用户组 o:other 示意其余以外的人 a:all 示意这三者皆是 r:读取; w:写入; x:可执行 +:减少权限; -:撤销权限; =:设定权限 批改文件所有者的权限:chmod u+w XXX.txt 批改文件所有者的属于同一组的权限:chmod g+w XXX.txt 批改其他人的权限:chmod o+w XXX.txt 批改三者的权限:chmod a+w XXX.txt (2).数字法(读、写、执行<--->4、2、1;不具备任何权限是0): 例0:chmod u=rwx,g=rx,o=r filename <=======>chmod u=7,g=5,o=4 filename 例1: chmod 751 file 文件所有者:读、写、执行权限(7=4+2+1) 同组用户:读、执行的权限(5=4+1) 其它用户:执行的权限(1=1) 例2: chmod 777 file:所有用户领有读、写、执行权限 例3: 如果想递归所有目录加上雷同权限,须要加上参数"-R" chmod 777 test/ -R 递归 test 目录下所有文件加 777 权限 ...

August 3, 2022 · 3 min · jiezi

关于linux运维:Linux系统增加内网ip

零碎版本:centos71.cd到网卡门路下2.复制原有的网卡文件,并批改成本人须要的3.重启网卡4.ping测试

July 22, 2022 · 1 min · jiezi

关于linux运维:linux培训笔记

单双引号反引号阐明:test=`date` ### 反引号里能够写命令 "$test dddddd" ### 变量在双引号里能够应用"${test}ssssss" ### 变量与字符相连要应用{}'"sssss" "sssss"' ### 单引号里只能写双引号"'sssss' "sssssdfsdf" 'dfdsfdf'" ### 双引号里只能写单引号 "'ssssss' \"sdfsdfsdf\" " ### 如果想那啥请\ 转译[root@elk-filebeat ~]# sh +x /tmp/ll.sh 2022年 07月 08日 星期五 18:05:49 CST dddddd2022年 07月 08日 星期五 18:05:49 CSTssssss 这个谬误示范"sssss" "sssss"'sssss' sssssdfsdf 'dfdsfdf''ssssss' "sdfsdfsdf" [root@elk-filebeat ~]# cat /tmp/ll.sh #!/bin/bashtest=`date`echo "$test dddddd" ###echo "${test}ssssss"echo "$testssssss 这个谬误示范"echo '"sssss" "sssss"'echo "'sssss' "sssssdfsdf" 'dfdsfdf'"echo "'ssssss' \"sdfsdfsdf\" "

July 8, 2022 · 1 min · jiezi

关于linux运维:7z压缩时排除指定文件或目录

场景:有时打包压缩目录,想要排除疏忽某些子文件和子目录,防止一些文件多体积大的不重要文件目录占用长期备份空间,且能够缩小压缩工时。\# 举例目录: tmp #想要打包的目录├─ aaa #目录├─ bbb #目录├─ ccc.txt #文件└─ ddd.txt #文件\# 7z排除/疏忽指定目录和文件的命令示范: 7z a -t7z tmp.7z ./tmp '-xr!aaa/' '-xr!ccc.txt' #压缩包里的内容胜利排除了aaa目录和ccc.txt文件,只剩下bbb目录和ddd.txt文件:tmp.7z├─ bbb└─ ddd.txt\# 7z参数解释 tmp.7z 是压缩包的文件名./tmp 是想要压缩的目录a 代表增加文件/文件夹到压缩包-t 是指定压缩类型 个别咱们定为7z-xr! 是排除文件夹和文件,*留神:'!'感叹号在Linux中是零碎非凡事件符号,在Shell命令中应用时需加''单引号本义成一般字符串。\# 7z门路规定: 门路规定:7z语法中的门路规定,是以压缩指标为根目录,比方“7z a tmp.7z ./tmp”中,“tmp/”就是7z语法中所有门路的最顶层,因而应用主机绝对路径就不能正确匹配,“tmp/aaa/”在主机中的绝对路径是“root/tmp/aaa/”,如果在7z语法中是应用“root/tmp/aaa/”,7z程序里理论解读的是“tmp/root/tmp/aaa/”。举例:咱们要压缩tmp/目录和排除tmp/下的aaa/目录:7z a -t7z tmp.7z ./tmp '-xr!aaa' '-xr!ccc.txt' #√ aaa无效7z a -t7z tmp.7z ./tmp '-xr!aaa/' '-xr!ccc.txt' #√ aaa/无效7z a -t7z tmp.7z ./tmp '-xr!/aaa/' '-xr!ccc.txt' #× 不匹配 /aaa/二次运行会提醒外部文件名抵触7z a -t7z tmp.7z ./tmp '-xr!/aaa' '-xr!ccc.txt' #×不匹配 /aaa二次运行会提醒外部文件名抵触7z a -t7z tmp.7z ./tmp '-xr!*tmp/aaa' '-xr!ccc.txt' #√ *tmp/aaa通配符无效7z a -t7z tmp.7z ./tmp '-xr!*tmp/aaa/' '-xr!ccc.txt' #√ *tmp/aaa/通配符无效7z a -t7z tmp.7z ./tmp '-xr!./aaa/' '-xr!ccc.txt' #√ ./aaa/相对路径语法无效7z a -t7z tmp.7z ./tmp '-xr!tmp/aaa/' '-xr!ccc.txt' #√ 以tmp作为根目录的绝对路径语法无效7z a -t7z tmp.7z ./tmp '-xr!/tmp/aaa' '-xr!ccc.txt' #× 不匹配 /tmp/aaa不应超出tmp/根目录7z a -t7z tmp.7z ./tmp '-xr!./tmp/aaa/' '-xr!ccc.txt' #× 不匹配 ./tmp/aaa/不应超出tmp/根目录7z a -t7z tmp.7z ./tmp '-xr!/root/tmp/aaa/' '-xr!ccc.txt' #× /root/tmp/aaa主机绝对路径被7z解读成以tmp为根目录的门路因此匹配失败

March 26, 2022 · 1 min · jiezi

关于linux运维:clearos安装clearos系统

一、参考链接阿里巴巴开源镜像站-OPSX镜像站-阿里云开发者社区 clearos镜像-clearos下载地址-clearos装置教程-阿里巴巴开源镜像站 ClearOS – OS for your Server, Network, and Gateway Systems 二、clearos介绍ClearOS是一个基于CentOS和Red Hat Enterprise Linux的简略,开源,价格合理的Linux操作系统。 它设计用于中小型企业作为服务器或网络网关。三、clearos装置<font color=blue>Install ClearOS 7.9.1.342252</font> <font color=blue>抉择装置过程中的语言</font> <font color=blue>磁盘分区</font> <font color=blue>开始装置</font> <font color=blue>设置ROOT明码。期待装置实现。</font> <font color=blue>装置实现,重启零碎。</font> <font color=blue>登录账号</font> <font color=blue>配置网络信息参数。</font> # 测试网络连通性[root@localhost ~]# ping baidu.com -c 5PING baidu.com (220.181.38.148) 56(84) bytes of data.64 bytes from 220.181.38.148 (220.181.38.148): icmp_seq=1 ttl=128 time=32.2 ms64 bytes from 220.181.38.148 (220.181.38.148): icmp_seq=2 ttl=128 time=32.1 ms64 bytes from 220.181.38.148 (220.181.38.148): icmp_seq=3 ttl=128 time=48.8 ms64 bytes from 220.181.38.148 (220.181.38.148): icmp_seq=4 ttl=128 time=28.9 ms64 bytes from 220.181.38.148 (220.181.38.148): icmp_seq=5 ttl=128 time=30.3 ms--- baidu.com ping statistics ---5 packets transmitted, 5 received, 0% packet loss, time 13052msrtt min/avg/max/mdev = 28.977/34.512/48.819/7.255 ms[root@localhost ~]#<font color=blue>查看零碎版本信息</font>[root@localhost ~]# hostnamectl Static hostname: localhost.localdomain Icon name: computer-vm Chassis: vm Machine ID: 3e9cbb095bec4c4d934fa531f7a8df04 Boot ID: d9bf2a054f6b402683f6e14147c4f0fa Virtualization: vmware Operating System: ClearOS 7 (Final) CPE OS Name: cpe:/o:clearos:clearos:7 Kernel: Linux 3.10.0-1160.42.2.el7.x86_64 Architecture: x86-64[root@localhost ~]#<font color=red>装置步骤与装置CentOS等Linux零碎差不多,能够按ALT+F1~F6切换图形或者命令行界面。</font>进行配置。至此,ClearOS装置实现。 ...

February 28, 2022 · 1 min · jiezi

关于linux运维:比较两个节点对应目录数据一致性校验

跨节点文件目录数据一致性校验-Shell组件校验工具阐明# cksumPrint CRC checksum and byte counts of each FILE# md5sumPrint or check MD5 (128-bit) checksums# sha1sumPrint or check SHA1 (160-bit) checksums# sha256sumPrint or check SHA256 (256-bit) checksums应用成果演示$ cksum md5_b.txt2325705422 16392970 md5_b.txt$ md5sum md5_b.txt 05eb026baaeecd0cf17c5c3d991bdde4 md5_b.txt$ sha1sum md5_b.txt 443d40550fa3be62a9a8c614088ef53309280657 md5_b.txt$ sha256sum md5_b.txt 2b691daf9e0f9193448322689812839102d00c7e0e4dada2cb465157ec120f58 md5_b.txt步骤遍历目录中的文件并计算其哈希码,将哈希码和文件名一行行记录至一个文本中在A、B节点别离跑步骤一,失去两个数据文本以文件名作为遍历对象遍历A节点数据文本,每一A节点遍历内从B节点数据文本中找同名文件名,找不到则证实B节点此目录下无此文件;找到则进一步比照文件名对应的哈希码,雷同则证明文件内容统一,不同则证明文件不统一代码data_consistency.sh#!/bin/bash# name:data_consistency.sh# auth:cyrus_chen# func:calsum_dir2txt compare_txt# version:v1.0# sys:centos7# usage: bash data_consistency.sh cksum /test 127.0.0.1set -esum_method=$1sum_dir=$2remote_ip=$3local_txt="a.txt"remote_txt="b.txt"calsum_dir2txt() { sum_method=$1 sum_dir=$2 remote_ip=$3 local_txt=$4 remote_txt=$5 if [ ! -d $sum_dir ];then echo "目录$sum_dir不存在" exit 1 fi if [ $sum_method == "cksum" ];then # echo "这是${sum_method}" sudo find $sum_dir -type f|xargs cksum|awk '{print $1 "\t" $3}' > ./$local_txt echo "请输出$remote_ip的ssh明码" ssh apps@$remote_ip "bash ./cksum.sh $sum_dir ./$remote_txt" echo "请再次输出$remote_ip的ssh明码" scp $remote_ip:./$remote_txt . elif [ $sum_method == "md5sum" -o $sum_method == "sha1sum" -o $sum_method == "sha256sum" ];then # echo "这是${sum_method}" sudo find $sum_dir -type f|xargs $sum_method > ./$local_txt echo "请输出$remote_ip的ssh明码" ssh apps@$remote_ip "bash ./hashsum.sh $sum_method $sum_dir ./$remote_txt" echo "请再次输出$remote_ip的ssh明码" scp $remote_ip:./$remote_txt . else echo "目前只反对[cksum md5sum sha1sum sha256sum]" fi}compare_txt() { local_txt=$1 remote_txt=$2 if [ ! -f "./${local_txt}" ];then echo "./${local_txt}不存在" exit 1 fi if [ ! -f "./${remote_txt}" ];then echo "./${remote_txt}不存在" exit 1 fi for f in `awk '{print $2}' ./${local_txt}` do if grep -qw "$f" ./${remote_txt} then md5_a=`grep -w "$f" ./${local_txt}|awk '{print 1}'` md5_b=`grep -w "$f" ./${remote_txt}|awk '{print 1}'` if [ "X${md5_a}" != "X${md5_b}" ] then echo "$f changed." fi else echo "$f deleted." fi done}main() { #calsum_dir2txt $sum_method $sum_dir $remote_ip $local_txt $remote_txt compare_txt $local_txt $remote_txt}maincksum.sh(扔到remote_ip上)#!/bin/bash# name:cksum.sh# auth:cyrus_chen# version:v1.0# sys:centos7# usage: bash cksum.sh /test 127.0.0.1 ./b.txtset -esum_dir=$1remote_txt=$2sudo find $sum_dir -type f|xargs cksum|awk '{print $1 "\t" $3}' > $remote_txthashsum.sh(扔到remote_ip上)#!/bin/bash# name:hashsum.sh# auth:cyrus_chen# version:v1.0# sys:centos7# usage: bash hashsum.sh md5sum /test 127.0.0.1 ./b.txtset -esum_method=$1sum_dir=$2remote_txt=$3sudo find $sum_dir -type f|xargs $sum_method > $remote_txt

February 17, 2022 · 2 min · jiezi

关于linux运维:linux时间管理

Linux工夫设置 date、hwclock、timedatectldate 查看及设置零碎工夫: [root@localhost ~]# dateThu Jan 13 16:30:27 CST 2022[root@localhost ~]# date -s "20220113 16:33:00"Thu Jan 13 16:33:00 CST 2022hwclock设置零碎工夫: [root@localhost ~]# hwclock2022-01-13 16:37:35.195393+08:00//同步硬件工夫到零碎工夫[root@localhost ~]# hwclock -s[root@localhost ~]# hwclock --hctosys//同步零碎工夫到硬件工夫[root@localhost ~]# hwclock -w[root@localhost ~]# hwclock --systohctimedatectl工夫治理: //查问工夫及时区[root@localhost ~]# timedatectl Local time: Thu 2022-01-13 16:53:10 CST Universal time: Thu 2022-01-13 08:53:10 UTC RTC time: Thu 2022-01-13 16:53:09 Time zone: Asia/Shanghai (CST, +0800)System clock synchronized: yes NTP service: active RTC in local TZ: yes//查问并设置时区[root@localhost ~]# timedatectl list-timezones[root@localhost ~]# timedatectl set-timezone "Asia/Shanghai"//设置日期和工夫[root@localhost ~]# timedatectl set-time '16:10:40 2015-11-20'[root@localhost ~]# timedatectl set-time UTC//设置硬件工夫为本地工夫[root@localhost ~]# timedatectl set-local-rtc 1[root@localhost ~]# timedatectl set-local-rtc 0//Linux工夫同步 ntpdate、ntpd、chronydntpdate工夫同步: ...

January 13, 2022 · 4 min · jiezi

关于linux运维:12月发布两大特别专区一图了解龙蜥社区大事件

2021年已过,小龙带大家从经营看板、龙蜥看点、特地专区推送、生态亮点、龙蜥流动、精彩内容举荐六个方面回顾龙蜥社区 12 月都产生了哪些大事件。欢送更多的开发者退出,与咱们一起共建龙蜥社区,打造一个面向未来的开源操作系统!

January 12, 2022 · 1 min · jiezi

关于linux运维:centos74安装python39环境

本次针对于centos零碎和python3.9,其余版本操作类似补充知识点:centos自身环境里是有python默认版本的,我这里是Python 2.7.5,同时Linux下源码的装置个别由3个步骤组成:配置(configure)、编译(make)、装置(make install),装置python开发环境也是这个步骤 1、yum装置依赖环境yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel2、python官网下载Python3.9.0其余版本也是一样的1.官网地址https://www.python.org/点击downloads2.应用wget命令下载 yum -y install wgetwget https://www.python.org/ftp/python/3.9.0/Python-3.9.0.tgz3、创立装置目录mkdir /usr/local/python3 tar -zxvf Python-3.9.0.tarcd Python-3.9.0./configure --prefix=/usr/local/python3make && make install4、创立软链接ln -s /usr/local/python3/bin/python3 /usr/bin/python3ln -s /usr/local/python3/bin/pip3 /usr/bin/pip35、测试输出python 进入python2 输出python3 进入python3的解释器

January 5, 2022 · 1 min · jiezi

关于linux运维:Rocky-LinuxRocky-Linux-85版本全新图文安装教程并更换阿里镜像源等配置信息

一、参考链接阐明文章波及镜像下载和参考资料如下: Rocky Linux官网:https://rockylinux.org/ Rocky Linux官网装置手册文档:https://docs.rockylinux.org/zh/guides/installation/ Rcoky Linux 8.5版本镜像下载链接:https://www.rockylinux.org/download/ 阿里巴巴开源镜像站:https://developer.aliyun.com/mirror/ 阿里巴巴Rocky Linux镜像源链接:https://developer.aliyun.com/mirror/rockylinux?spm=a2c6h.13651102.0.0.46951b11x4Qj3N 二、什么是Rocky Linux?Rocky Linux是一个社区企业操作系统,旨在100%兼容美国顶级企业Linux发行版,因为其上游合作伙伴曾经扭转了方向。它正在由社区密集开发。Rocky Linux由CentOS我的项目的创始人Gregory Kurtzer领导。请贡献者应用此站点上提供的通信选项进行分割。 Rocky Linux 是 CentOS 的一个分支,它位于 Red Hat Enterprise Linux(RHEL) 的上游。与 CentOS 一样,它提供了非常适合服务器的稳定版 Linux。它旨在作为 CentOS 的齐全兼容替代品。 三、Rocky Linux零碎装置步骤1、下载Rocky Linux官网镜像Rocky-8.5-x86_64-dvd1.iso依据须要抉择对应的版本进行下载安装即可。 本试验应用Rocky-8.5-x86_64-dvd1.iso镜像进行安装操作。(此镜像大小约为9.98 GB ,可提前下载筹备至本地。) 2、进入Rocky Linux的初始装置界面抉择install Rocky Linux 8后,按下回车键enter,开始装置Rocky Linux。 3、抉择装置过程中的 语言本试验采纳中文装置。单击“持续”。 4、设置相干装置信息摘要本界面分为以下四个局部:本地化(键盘、语言反对以及工夫和日期)软件(装置源和软件抉择)零碎(装置目的地以及网络和主机名)用户设置(设置root明码和创立普通用户) (1)批改本地化中的工夫和日期设置地区为亚洲,城市为上海。 (2)设置软件中软件抉择。这里应用带GUI的服务器。点击“实现”。 (3)设置零碎中的磁盘分区抉择“自定义”进行分区。单击“实现”。进入下一个界面。这里抉择==LVM==磁盘分区计划,点击“点击这里主动创立它们”实现磁盘分区。磁盘分区实现,点击“实现”。确认磁盘分区,点击“承受更改”。 (4)在用户设置中设置ROOT明码若设置的ROOT明码太简略,须要按两次 实现 按钮能力容许设置。 5、装置信息设置实现后,开始装置期待装置实现。 6、装置实现,重启零碎 7、重启零碎后,进行初始化操作 (1)勾选✔许可条款 (2)完结配置 (3)设置用户名 (4)设置用户名明码 8、初始化实现,开始应用 三、Rocky Linux系统配置步骤1、批改主机名hostnamectl set-hostname rockstar 2、配置网络信息(1)批改ifcfg-ens160网络配置文件[root@rockstar ~]# vi /etc/sysconfig/network-scripts/ifcfg-ens160 [root@rockstar ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens160 TYPE=EthernetPROXY_METHOD=noneBROWSER_ONLY=noBOOTPROTO=staticDEFROUTE=yesIPV4_FAILURE_FATAL=noIPV6INIT=yesIPV6_AUTOCONF=yesIPV6_DEFROUTE=yesIPV6_FAILURE_FATAL=noNAME=ens160UUID=f0ef2848-1724-475a-9187-31960c3e500aDEVICE=ens160ONBOOT=yesIPADDR=192.168.1.150PREFIX=24GATEWAY=192.168.1.1DNS1=8.8.8.8DNS2=114.114.114.114 ...

December 8, 2021 · 2 min · jiezi

关于linux运维:每周一个linux命令ping

根底环境 ping命令介绍 ping命令次要用来做IPv4、IPv6主机或网关是否可达、是否丢包、网络提早的测试命令,windows、linux、mac均具备此命令,各个平台应用相似,本教程以centos为根底。以下为官网定义翻译: ping 应用 ICMP 协定的强制 ECHO_REQUEST 数据报从主机或网关引出 ICMP ECHO_RESPONSE。 ECHO_REQUEST 数据报(``pings'')有一个 IP 和 ICMP 标头,后跟一个struct timeval 而后是任意数量的“pad”字节用于填充数据包。 ping 实用于 IPv4 和 IPv6。能够通过指定 -4 或 -6 来强制仅显式应用其中之一。 ping 还能够发送 IPv6 节点信息查问 (RFC4620)。可能不容许两头跃点,因为不举荐应用 IPv6 源路由 (RFC5095)。以下为官网定义原文: ping uses the ICMP protocol's mandatory ECHO_REQUEST datagram to elicit an ICMP ECHO_RESPONSE from a host or gateway. ECHO_REQUEST datagrams (``pings'') have an IP and ICMP header, followed by a struct timeval and then an arbitrary number of ``pad'' bytes used to fill out the packet. ping works with both IPv4 and IPv6. Using only one of them explicitly can be enforced by specifying -4 or -6. ping can also send IPv6 Node Information Queries (RFC4620). Intermediate hops may not be allowed, because IPv6 source routing was deprecated (RFC5095).ping常用命令参数 ping [参数] 主机或网关、域名-4 ping ipv4 地址,默认IPv4-6 ping ipv6 地址-c 发送ping包的数量ping 主机IP或网关ping 192.168.100.100网络可达状态 ...

November 20, 2021 · 1 min · jiezi

关于linux运维:每周一个linux命令ip

根底环境 Ip命令介绍ip命令是一个可能给linux零碎设置网络相干信息的命令,通过ip命令能够设置ip地址、子网掩码、网关、路由信息,本节次要解说ip地址的查看、长期ip地址、子网掩码、网关的设置。 查看所有网卡的ip地址ip a 留神: inet后边紧跟的是IP地址 查看单个网卡的IP地址ip addr show eth0 设置网卡的长期ip地址设置长期ipip addr add 192.168.100.18/24 dev eth0 查看更改后的成果 原文地址

November 6, 2021 · 1 min · jiezi

关于linux运维:SElinux给各种设置带来的困扰

#sestatusSELinux status: enabledSELinuxfs mount: /sys/fs/selinuxSELinux root directory: /etc/selinuxLoaded policy name: targetedCurrent mode: enforcingMode from config file: enforcingPolicy MLS status: enabledPolicy deny_unknown status: allowedMemory protection checking: actual (secure)Max kernel policy version: 31这表明SELinux已启动并正在运行。 要临时禁用SELinux,请运行命令。 # setenforce 0另外,您能够运行命令。 # setenforce Permissive这些命令中的任何一个都将临时禁用SELinux,直到下次重启为止。 如何在CentOS 8上永恒禁用SELinux# vi /etc/selinux/config# This file controls the state of SELinux on the system.# SELINUX= can take one of these three values:# enforcing - SELinux security policy is enforced.# permissive - SELinux prints warnings instead of enforcing.# disabled - No SELinux policy is loaded.SELINUX=disabled# SELINUXTYPE= can take one of these three values:# targeted - Targeted processes are protected,# minimum - Modification of targeted policy. Only selected processes are protected.# mls - Multi Level Security protection.SELINUXTYPE=targeted

October 11, 2021 · 1 min · jiezi

关于linux运维:Linux常用命令

一、根本命令1.1 关机和重启关机 shutdown -h now 立即关机shutdown -h 5 5分钟后关机poweroff 立即关机重启 shutdown -r now 立即重启shutdown -r 5 5分钟后重启reboot 立即重启1.2 帮忙命令--help命令 shutdown --help: ifconfig --help:查看网卡信息 man命令(命令说明书) man shutdown 留神:man shutdown关上命令说明书之后,应用按键q退出 二、目录操作命令2.1 目录切换 cd命令:cd 目录 cd / 切换到根目录cd /usr 切换到根目录下的usr目录cd ../ 切换到上一级目录 或者 cd ..cd ~ 切换到home目录cd - 切换到上次访问的目录 2.2 目录查看 ls [-al]命令:ls [-al] ls 查看当前目录下的所有目录和文件ls -a 查看当前目录下的所有目录和文件(包含暗藏的文件)ls -l 或 ll 列表查看当前目录下的所有目录和文件(列表查看,显示更多信息)ls /dir 查看指定目录下的所有目录和文件 如:ls /usr 2.3 目录操作【增,删,改,查】2.3.1 创立目录【增】 mkdir命令:mkdir 目录 ...

September 15, 2021 · 9 min · jiezi

关于linux运维:linux-环境配置相关命令

查看依赖须要如何装置 yum whatprovides libc.so.6参考:https://v5.net/CentOSApp/cent...

July 26, 2021 · 1 min · jiezi

关于linux运维:玩转Linux介绍一个强大的Linux服务器管理面板比宝塔更强

介绍之前大多数时候听到或者看到的Linux服务器的治理面板都是宝塔面板,的确宝塔面板十分不便而且好用,装置也简略,复制粘贴几句命令即可装置实现,且提供免费版,本文向大家介绍另一个Linux的服务器面板——AppNode,功能丰富,也提供免费版,且是永恒收费! 零碎要求操作系统: CentOS 6.x 32/64位CentOS 7.x 64位(暂不反对 Ubuntu、Debian)。内存要求: 倡议可用内存在 512MB 以上。装置教程官网提供了收费教程,且装置非常简单,能够通过配置的形式主动生成装置命令: 以上前提是你对Linux服务器有肯定的理解,至多你得会应用SSH客户端连贯你的服务器,这里向大家举荐收费的远程管理工具mRemoteNG或者应用FinalShell,上面是mRemoteNG的Github地址: https://github.com/mRemoteNG/...1、应用官网提供了命令配置生成配置脚本 2、通过SSH客户端连贯服务器(留神零碎要求) 3、查看装置演示: 装置至最初一步时,会顺次提醒您输出端口、用户名、明码,请依据提醒输出后按下回车键进入下一步,如果想应用中括号中的默认值,可间接按回车键。(动图不清晰,间接查看官网) 后盾治理介绍集中式设计,疾速切换治理 装置一个控制中心即可治理你的所有服务器,其它服务器只须要装置受控端。再也不必别离登录到每台服务器去治理了。 不限度服务器数量集中显示运行状况在线 SSH 终端连贯分组治理自定义节点名称反对通过 SSH 隧道连贯受控端多用户服务器权限治理(开发中) 弱小的网站治理性能 通过整合 Nginx、PHP、MySQL 等组件,帮忙您疾速创立和配置网站。 多种架构:PHP、纯动态、反向代理组件可选择性装置,PHP多版本并存创立网站时主动创立数据库和FTPRewrite、SSI、Gzip、跳转、缓存等丰盛的配置并发限度、申请限度、下载限速目录大小限度和写入防护HTTP/2.0、Let's Encrypt收费证书批量备份和导入,定时备份建站市场一键下载安装网站源码更多架构反对:Node.js、Java、Python(开发中) 疾速装置降级,丰盛的软件市场 仅需执行一条命令即可全自动装置,装置耗时不到 1 分钟。版本升级无需重装,一键点击即可在线降级。丰盛的软件市场,满足您多样化的服务器软件需要,您的服务器不再仅仅是 Web 服务器。 自定义装置命令基于零碎默认软件管理体系采纳 Go 语言开发,自带 HTTP 服务,环境无依赖软件批量装置、批量降级、主动降级超过 40+ 个应用软件性能超过 100+ 个 PHP 扩大超过 10+ 个 Nginx 模块软件还在一直继续减少和保护 多重平安加固,资源实时监控 从操作系统层面和利用层面,提供多项加固措施保障您的服务器和利用平安。弱小的系统监控性能,让您对服务器的资源耗费状况了如执掌。 SSH 登录告诉面板登录告诉防火墙疾速端口开关、IP 黑名单所有过程的端口凋谢状态集中查看和治理网站目录防护,禁止上传后门文件受控端反对走 SSH 隧道,不裸露新端口对系统资源应用状况的采集、监控和警报网站防 CC 攻打 全面凋谢的 API 全面凋谢的 API 机制,便于您将 AppNode 已有的性能整合到您的零碎中。 基于 HTTP/HTTPS 的 API 调用基于 HMAC-MD5 签名的 API 验证机制面板所有性能均基于 API 实现,开放度为 100%迷信的模块划分,每个模块领有本人的独立的 API 文档良好的 API 路由机制,从控制中心到受控端利用的 API 均可轻松调用 ...

May 9, 2021 · 1 min · jiezi

关于linux运维:解决mysqldbc2919-致命错误mysqlh没有那个文件或目录

问题形容 mysqldb.c:29:19: 致命谬误:mysql.h:没有那个文件或目录 #include <mysql.h> ^编译中断。make[2]: *** [mysqldb.o] 谬误 1解决centos7yum install gcc libffi-devel python-devel openssl-devel mysql-devel -ymysql-devel 次要是装置这个ubantusudo apt-get install libmysqlclient-dev

April 29, 2021 · 1 min · jiezi

关于linux运维:tmux用法介绍

tmux是什么?tmux(Terminal MultipleXer)终端复用器。tmux的构造包含会话(session)、窗口(window)、窗格(pane)三局部。 为什么要用tmux?如果要进行耗时操作,呈现断电或断网等状况,会话就会终止,会话中的过程也会随之终止。理论场景: 1.大数据传输2.大型项目编译3.多窗口切换到晕tmux作用1.容许在单个窗口中,同时拜访多个会话;2.能够让新窗口接入已存在的会话;3.容许每个会话有多个连贯窗口,可实现多人共享;4.反对窗口的任意垂直和程度拆分;根本用法1.装置# centosyum install -y tmux# ubuntu 或 Debiansudo apt-get install tmux# macbrew install tmux2.会话治理创立会话tmux new -s <session-name>创立一个新会话后,终端界面如下图所示:其中,左侧为会话信息,右侧为零碎信息。会话信息简介: [0] 0:testuser@scarlett:~*会话编号/名称 窗格号拆散会话tmux detach或者ctrl+b d通过上述命令能够退出以后tmux窗口,然而会话和里边的过程仍会在后盾进行; 查看会话tmux ls# 输入test_01: 1 windows (created Mon Mar 15 09:46:59 2021) [92x23]接入会话# 应用会话编号接入tmux attach -t 0# 应用名称接入tmux attach -t <session-name>kill会话tmux kill-session -t 0tmux kill-session -t <session-name>切换会话tmux switch -t 0tmux switch -t <session-name>重命名会话tmux rename-session -t 0 <new-name>tmux rename-session -t <session-name> <new-name>3.快捷键在tmux会话中进行快捷键操作唤起快捷键的前缀键: ctrl+b一些罕用的快捷键 ctrl+b d # 剥离以后会话ctrl+b s # 列出所有会话ctrl+b $ # 重命名以后会话3.窗格(pane)操作在tmux创立的会话中进行窗口宰割操作 ...

March 15, 2021 · 1 min · jiezi

关于linux运维:使用nodeexporter监控服务器状态

1 装置node_exporter指标监控主机操作系统:Ubuntu Server 20.04 一键装置脚本: sudo useradd --no-create-home --shell /bin/false node_exporter \&& cd /opt && wget https://github.com/prometheus/node_exporter/releases/download/v0.18.1/node_exporter-0.18.1.linux-amd64.tar.gz \&& tar xvf node_exporter-0.18.1.linux-amd64.tar.gz \&& sudo mv node_exporter-0.18.1.linux-amd64 /opt/node_exporter \&& sudo chown node_exporter:node_exporter /opt/node_exporter -R \&& sudo touch /etc/systemd/system/node_exporter.service \&& sudo echo '[Unit]Description=Node ExporterWants=network-online.targetAfter=network-online.target[Service]User=node_exporterGroup=node_exporterType=simpleExecStart=/opt/node_exporter/node_exporter --collector.systemd[Install]WantedBy=multi-user.target' > /etc/systemd/system/node_exporter.service \&& sudo systemctl daemon-reload \&& sudo systemctl enable node_exporter \&& sudo systemctl start node_exporter \&& sudo journalctl -f --unit node_exporter装置实现后拜访:http://${host}:9100/,确认服务失常启动,如下图所示: 2 装置Prometheus工夫序列数据库Prometheus通过基于HTTP的pull形式采集时序数据,能够通过服务发现或者动态配置去获取要采集的指标服务器,反对单主节点工作,反对多种可视化图表及仪表盘。 在中控节点装置Prometheus,一键装置脚本: sudo mkdir -p /opt/promethes \&& touch /opt/promethes/promethes.yml \&& sudo echo 'global: scrape_interval: 15s external_labels: monitor: 'codelab-monitor'scrape_configs: - job_name: 'prometheus' scrape_interval: 5s static_configs: - targets: ['localhost:9090'] - job_name: 'node' scrape_interval: 5s static_configs: - targets: ['${host1}:9100','${host2}:9100', ...]' > /opt/promethes/promethes.yml \&& docker run -d --restart=always \ -p 9090:9090 \ -v /opt/promethes/promethes.yml:/etc/prometheus/prometheus.yml \ prom/prometheus加粗的targets的值是待监控的主机列表装置实现后拜访:http://${host}:9090/,确认服务失常启动,如下图所示: ...

February 23, 2021 · 1 min · jiezi

关于linux运维:01NSD云计算系统管理

什么是服务器?名词解释:可能为其余计算机提供服务的更高级的电脑!1.机架式2.塔式3.机柜式4.刀片机典型的服务模式C/S, Client/Server 架构有服务器提供资源或某种性能客户机应用资源或性能TCP/IP 协定TCP/IP 是最宽泛的通信协议包含大量的Internet利用中的标准协议反对跨网络架构、苦啊操作系统平台通信主机和主机之间的通信三要素 IP地址 子网掩码 IP路由 IP地址 作用:用来示意一个节点(连贯互联网设施)的网络地址 地址组成(点分十进制) 一共32个二进制数字 示意伟4个十进制数字,以 . 隔开 用于个别计算机网络 A类:1---127 网 主 主 主 B类:128---191 网 网 主 主C类:192---223 网 网 网 主子网掩码 为计算机标识IP地段的网络地位与主机位,利用二进制的1标识网络地位,利用二进制的0标识主机位 子网划分(理解) 网关概念与DNS服务器网关:解决不同网络的通信问题,一个网络到另一个网络的关口地址,波及到网络设备路由器一个网络的进口地址一个网络的进口地址

February 19, 2021 · 1 min · jiezi

关于linux运维:不定期找不到Intel-N-2230无线网卡

机器: Lenovo ThinkPad S440 (2014年出厂),也叫ThinkPad S3。操作系统:原装Windows 7,改装成Linux Mint 19、Manjaro,内核5.x相干硬件:Intel Wireless-N 2230无线网卡问题:在每次冷启动后,network manager会有1/3的概率显示没有无线网卡。用lspci也看不到该无线网卡。dmesg里看不到有error音讯。如果冷启动后显示有无线网卡,则无线网卡应用一切正常。在改装成Linux之前,Windows 7下应用齐全失常,从没呈现过无线网卡以概率失踪的状况。 PHP code? 1 2 $ uname -a Linux ThinkPad-S3 5.0.0-32-generic #34~18.04.2-Ubuntu SMP Thu Oct 10 10:36:02 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux PHP code? 1 2 $lspci 03:00.0 Network controller: Intel Corporation Centrino Wireless-N 2230 (rev c4) PHP code? 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 ...

February 18, 2021 · 1 min · jiezi

关于linux运维:服务器测试脚本集合

局部脚本来自Mr.KevinH综合测试原始版本Benchwget freevps.us/downloads/bench.sh -O - -o /dev/null|bash秋水逸冰的Bench.sh脚本特点:显示以后测试的各种零碎信息取自世界多处的出名数据中心的测试点,下载测试比拟全面反对 IPv6 下载测速;IO 测试三次,并显示平均值。应用:wget -qO- bench.sh | bash或者 curl -Lso- bench.sh | bash或者 wget -qO- 86.re/bench.sh | bash或者 curl -so- 86.re/bench.sh | bashGithub地址https://github.com/teddysun/across/blob/master/bench.sh 老鬼的SuperBench测试脚本这个脚本是在基于秋水大佬脚本的根底上,退出了独服通电工夫,服务器虚拟化架构等内容 特点:改良了显示的模式,基本参数增加了色彩,方面辨别与查找。I/O测试,更改了原来默认的测试的内容,采纳小文件,中等文件,大文件,别离测试IO性能,而后取平均值。速度测试替换成了 Superspeed 外面的测试,第一个默认节点是,Speedtest 默认,其余别离测试到中国电信,联通,挪动,各三个不同地区的速度。 应用办法wget -qO- --no-check-certificate https://raw.githubusercontent.com/oooldking/script/master/superbench.sh | bash或者 curl -Lso- -no-check-certificate https://raw.githubusercontent.com/oooldking/script/master/superbench.sh | bashGithub https://github.com/oooldking/script/blob/master/superbench.sh 91yuntest在线脚本生成地址 https://www.91yuntest.com/ 一般模式wget -N --no-check-certificate https://raw.githubusercontent.com/91yun/91yuntest/master/test_91yun.sh && bash test_91yun.sh一般模式就是之前的测试惯例内容。测试输入后果请参考:一般模式后果款式参考 简略模式wget -N --no-check-certificate https://raw.githubusercontent.com/91yun/91yuntest/master/test_91yun.sh && bash test_91yun.sh s简略模式的测试蕴含:惯例零碎参数检测,带宽测试,IO测试和全国ping测试。测试输入后果请参考:简略模式后果款式参考次要因为一般模式的下载测试和路由测试有些耗时,有时大家可能只须要疾速取得这台服务器的参数,带宽,io和提早是多少。那么简略模式能够节俭大量的工夫。如果须要进一步的信息则能够应用一般模式。相比一般模式,就是在命令最初加个s参数: bash test_91yun.sh s 齐全模式wget -N --no-check-certificate https://raw.githubusercontent.com/91yun/91yuntest/master/test_91yun.sh && bash test_91yun.sh a齐全模式相比一般模式多了unixbench的测试,测试输入后果请参考:齐全模式后果款式参考相比一般模式,就是在命令最初加个a参数: bash test_91yun.sh a因为unixbench的测试极其耗资源(cpu和io会长工夫处于占满状态),有些IDC禁用,会杀过程或者判断滥用。请审慎测试。另外unixbench的测试也极其耗时间,倡议大家在screen下运行。 ...

December 13, 2020 · 1 min · jiezi

关于linux运维:详解MySQL两阶段加锁协议

前言此篇博客次要是讲述MySql(仅限innodb)的两阶段加锁(2PL)协定,而非两阶段提交(2PC)协定,区别如下: 2PL,两阶段加锁协定:次要用于单机事务中的一致性与隔离性。 2PC,两阶段提交协定:次要用于分布式事务。 MySql自身针对性能,还有一个MVCC(多版本控制)管制,本文不思考此种技术,仅仅思考MySql自身的加锁协定。 什么时候会加锁在对记录更新操作或者(select for update、lock in share model)时,会对记录加锁(有共享锁、排它锁、意向锁、gap锁、nextkey锁等等),本文为了简略思考,不思考锁的品种。 什么是两阶段加锁在一个事务外面,分为加锁(lock)阶段和解锁(unlock)阶段,也即所有的lock操作都在unlock操作之前,如下图所示: 为什么须要两阶段加锁引入2PL是为了保障事务的隔离性,即多个事务在并发的状况下等同于串行的执行。 在数学上证实了如下的封闭定理: 如果事务是良构的且是两阶段的,那么任何一个非法的调度都是隔离的。 具体的数学推到过程能够参照<<事务处理:概念与技术>>这本书的7.5.8.2节.此书乃是对于数据库事务的圣经,无需解释(中文翻译尽管艰涩,也能保持读上来,强烈推荐) 工程实际中的两阶段加锁-S2PL在理论状况下,SQL是变幻无穷、条数不定的,数据库很难在事务中断定什么是加锁阶段,什么是解锁阶段。于是引入了S2PL(Strict-2PL),即: 在事务中只有提交(commit)或者回滚(rollback)时才是解锁阶段,其余工夫为加锁阶段。 如下图所示:这样的话,在理论的数据库中就很容易实现了。 两阶段加锁对性能的影响下面很好的解释了两阶段加锁,当初咱们剖析下其对性能的影响。思考上面两种不同的扣减库存的计划: 计划1:begin;// 扣减库存update t_inventory set count=count-5 where id=${id} and count >= 5;// 锁住用户账户表select * from t_user_account where user_id=123 for update;// 插入订单记录insert into t_trans;commit; 计划2:begin;// 锁住用户账户表select * from t_user_account where user_id=123 for update;// 插入订单记录insert into t_trans;// 扣减库存update t_inventory set count=count-5 where id=${id} and count >= 5;commit; 因为在同一个事务之内,这几条对数据库的操作应该是等价的。但在两阶段加锁下的性能确是有比拟大的差距。两者计划的时序如下图所示: 因为库存往往是最重要的热点,是整个零碎的瓶颈。那么如果采纳第二种计划的话,tps应该实践上可能晋升3rt/rt=3倍。这还仅仅是业务就只有三条SQL的状况下,多一条sql就多一次rt,就多一倍的工夫。 值得注意的是: ...

November 13, 2020 · 1 min · jiezi

关于linux运维:Linux运维工程师常用命令收藏

1、删除0字节文件 find -type f -size 0 -exec rm -rf {} ;2、查看过程 按内存从大到小排列 PS -e -o "%C : %p : %z : %a"|sort -k5 -nr3、按 CPU 利用率从大到小排列 ps -e -o "%C : %p : %z : %a"|sort -nr4、打印 cache 里的URL grep -r -a jpg /data/cache/* | strings | grep "http:" | awk -F'http:' '{print "http:"$2;}'5、查看 http 的并发申请数及其 TCP 连贯状态: netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'6、sed 在这个文里 Root 的一行,匹配 Root 一行,将 no 替换成 yes ...

November 12, 2020 · 3 min · jiezi

关于linux运维:Linux系统性能监控命令系列之-lsof

大家好!我是Sean! 持续咱们的Linux零碎中的性能监控命令,明天要分享的是lsof。 lsof (list open files) (一个列出以后零碎关上文件的工具)在linux环境下,万物皆文件,通过文件不仅仅能够拜访惯例数据,还能够拜访网络连接和硬件,所以如传输控制协议 (TCP) 和用户数据报协定 (UDP) 套接字等,零碎在后盾都为该应用程序调配了一个文件描述符,无论这个文件的实质如何,该文件描述符为应用程序与根底操作系统之间的交互提供了通用接口。因为应用程序关上文件的描述符列表提供了大量对于这个应用程序自身的信息,因而通过lsof工具可能查看这个列表对系统监测以及排错将是很有帮忙的。lsof如许弱小! 命令参数-a:列出关上文件存在的过程;-c<过程名>:列出指定过程所关上的文件;-g:列出GID号过程详情;-d<文件号>:列出占用该文件号的过程;+d<目录>:列出目录下被关上的文件;+D<目录>:递归列出目录下被关上的文件;-n<目录>:列出应用NFS的文件;-i<条件>:列出符合条件的过程。(4、6、协定、:端口、 @ip )-p<过程号>:列出指定过程号所关上的文件;-u:列出UID号过程详情;-h:显示帮忙信息;-v:显示版本信息。lsof输入各列的意义COMMAND:过程的名称PID:过程标识符PPID:父过程标识符(须要指定-R参数)USER:过程所有者PGID:过程所属组FD:文件描述符,应用程序通过文件描述符辨认该文件DEVICE:指定磁盘的名称SIZE:文件的大小NODE:索引节点(文件在磁盘上的标识)NAME:关上文件的确切名称FD列显示内容含意1. cwd:示意current work dirctory,即:应用程序的当前工作目录,这是该应用程序启动的目录,除非它自身对这个目录进行更改2. txt:该类型的文件是程序代码,如应用程序二进制文件自身或共享库,如上列表中显示的 /sbin/init 程序3. lnn:library references (AIX);4. er:FD information error (see NAME column);5. jld:jail directory (FreeBSD);6. ltx:shared library text (code and data);7. mxx :hex memory-mapped type number xx.8. m86:DOS Merge mapped file;9. mem:memory-mapped file;10. mmap:memory-mapped device;11. pd:parent directory;12. rtd:root directory;13. tr:kernel trace file (OpenBSD);14. v86 VP/ix mapped file;15. 0:示意规范输入16. 1:示意规范输出17. 2:示意规范谬误个别在规范输入、规范谬误、规范输出后还跟着文件状态模式:1. u:示意该文件被关上并处于读取/写入模式。2. r:示意该文件被关上并处于只读模式。3. w:示意该文件被关上并处于。4. 空格:示意该文件的状态模式为unknow,且没有锁定。5. -:示意该文件的状态模式为unknow,且被锁定。同时在文件状态模式前面,还跟着相干的锁:1. N:for a Solaris NFS lock of unknown type;2. r:for read lock on part of the file;3. R:for a read lock on the entire file;4. w:for a write lock on part of the file;(文件的局部写锁)5. W:for a write lock on the entire file;(整个文件的写锁)6. u:for a read and write lock of any length;7. U:for a lock of unknown type;8. x:for an SCO OpenServer Xenix lock on part of the file;9. X:for an SCO OpenServer Xenix lock on the entire file;10. space:if there is no lock.TYPE列显示内容含意1. DIR:示意目录。2. CHR:示意字符类型。3. BLK:块设施类型。4. UNIX: UNIX 域套接字。5. FIFO:先进先出 (FIFO) 队列。6. IPv4:网际协议 (IP) 套接字。7. REG:一般文件常用命令查看所有曾经关上的文件,不须要跟参数即可,不过输入的内容比拟多lsof ...

November 5, 2020 · 2 min · jiezi

关于linux运维:Linux系统性能监控命令系列之-sar

大家好,我是Sean 在应用咱们碰到问题堪称是形形色色,零碎卡顿、死机、宕机、I/O呈现瓶颈等等,这时,咱们应该思考应用零碎给咱们提供的sar命令来对系统作一个理解,该命令是系统维护的重要工具,次要帮忙咱们把握系统资源的应用状况,特地是内存和CPU 的应用状况。 sar(零碎运行状态统计工具)在应用咱们碰到问题堪称是形形色色,零碎卡顿、死机、宕机、I/O呈现瓶颈等等,这时,咱们应该思考应用零碎给咱们提供的sar命令来对系统作一个理解,该命令是系统维护的重要工具,次要帮忙咱们把握系统资源的应用状况,特地是内存和CPU 的应用状况。 sar命令 是Linux下零碎运行状态统计工具,它将指定的操作系统状态计数器显示到规范输出设备。sar工具将对系统以后的状态进行取样,而后通过计算数据和比例来表白零碎的以后运行状态。它的特点是能够间断对系统取样,取得大量的取样数据。取样数据和剖析的后果都能够存入文件,应用它时耗费的系统资源很小。 启动命令参数-A:显示所有的报告信息;-b:显示I/O速率;-B:显示换页状态;-c:显示过程创建活动;-d:显示每个块设施的状态;-e:设置显示报告的完结工夫;-f:从指定文件提取报告;-i:设状态信息刷新的间隔时间;-P:报告每个CPU的状态;-R:显示内存状态;-u:显示CPU利用率;-v:显示索引节点,文件和其余内核表的状态;-w:显示替换分区状态;-x:显示给定过程的状态。常用命令查看CPU应用状况sar 1 3 或 sar -u 1 3 每1秒打印一次cpu情况,打印3次后退出将cpu统计后果保留到文件sar -o test 1 3每1秒打印一次cpu情况,打印3次后退出,并保留到文件testsar -f test查看保留到test文件的cpu记录查看均匀负载sar -q 1 3查看零碎swap分区统计状况sar -W 1 3查看IO和传递速率sar -b 1 3查看磁盘应用状况sar -d 统计网络信息 sar -n DEVsar -n EDEV统计socket连贯信息 sar -n SOCKTCP连贯的统计 sar -n TCP查看内存应用状况sar -r 1 3命令详解查看CPU应用状况sar 1 3 或 sar -u 1 3 %user 用户空间的CPU应用%nice 扭转过优先级的过程的CPU使用率%system 内核空间的CPU使用率%iowait CPU期待IO的百分比 %steal 虚拟机的虚拟机CPU应用的CPU%idle 闲暇的CPU在以上的显示当中,次要看%iowait和%idle,%iowait过高示意存在I/O瓶颈,即磁盘IO无奈满足业务需要,如果%idle过低示意CPU使用率比较严重,须要联合内存应用等状况判断CPU是否瓶颈 sar还能够把CPU应用状况记录成二进制文件,并能够从新读取: 生成文件:sar -o test 1 3查看文件:sar -f test查看均匀负载sar -q 1 3 ...

November 5, 2020 · 1 min · jiezi

关于linux运维:在linux上部署项目

在linux上部署我的项目linux的配置1.查看网络ping www.baidu.com 1.2装置数据库mariadbsudo yum install mariadb-server 1.3连贯数据库配置1.启动数据库systemctl start mariadb 2.批改数据库明码mysql_secure_installation 3.进入数据库批改权限mysql -uroot -proot;use mysql; select host,user from user; update user set host='%' where host='localhost';flush privileges; 4.防火墙策略firewall-cmd --state // 查看防火墙开闭状态 firewall-cmd --list-ports // 查看防火墙凋谢端口 firewall-cmd --query-port=80/tcp // 查看端口是否凋谢 firewall-cmd --add-port=80/tcp --permanent // 增加端口firewall-cmd --reload // 重启防火墙 systemctl disable firewalld.service // 设置当前默认敞开防火墙 5.连贯数据库ip addr // 查看本机ip地址 1.4连贯数据库 连贯后的界面 插入数据库2.反向代理Nginx的装置和应用2.1批改hosts文件 在文件中增加如下代码192.168.126.128 image.jt.com 192.168.126.128 manage.jt.com127.0.0.1 www.jt.com127.0.0.1 sso.jt.com127.0.0.1 localhost2.2装置nginx 应用MobaXterm软件,连贯虚拟机 进入工作目录cd /usr/local/src/ ...

October 12, 2020 · 1 min · jiezi

关于linux运维:oeasy教您玩转linux010110内容回顾

咱们来回顾一下????咱们都讲了什么????? linux的历史⌨️各种发行版的生生灭灭零碎运作的过程????程序运行的过程各种命令⌨️命令行技巧????命令Command????unamecdlscatpwdman灵魂三问whatiswhereiswhich命令行快捷方式????记忆命令⬆️ 上一条命令⬇️️ 下一条命令ctrl+r 搜寻历史命令疾速挪动⬅️ 向左一格➡️️ 向右一格ctrl + ⬅️ 向左一个单词ctrl + ➡ 向右一个单词ctrl + a 间接到头ctrl + e 间接到尾疾速删除ctrl + c 疏忽以后行ctrl + u 全副删除ctrl + k 从光标地位删除到结尾登出零碎ctrl + d 登出零碎log out这就是咱们最开始接触到的linux很乏味,筹备进入更好玩的游乐场吧!!!????

September 1, 2020 · 1 min · jiezi

关于linux运维:oeasy教您玩转linux010108到底哪个which

回顾上次内容????咱们上次讲了查找命令地位whereis 我想找到whereis的地位怎么办????? whereis whereis 命令有三种地位二进制代码binary源代码source帮忙手册manual咱们找到了ls对应的源代码的地位,然而咱们有的时候会面对这样的问题,一个命令有多条二进制代码和他对应.咱们到应用的是哪个????? 到底哪个?which????比方咱们想晓得咱们应用的java在哪里????? whereis java 我只想查java的二进制文件 whereis -b java 也有好多,到底哪个????? 比方咱们想晓得咱们应用的java在哪里? which java 这样咱们就失去了二进制外面的第一个,也就是咱们执行命令时候对应硬盘的地位.咱们来玩吧????各种命令都来当which的参数 which pwdwhich unamewhich whatiswhich whereis当初咱们有了三个灵魂之问了✊ whatis 你是谁whereis 你在哪which 到底在哪通过这三个命令咱们能够晓得,任何命令的作用、地位,咱们给这三个问号起名叫灵魂三问 !???? 灵魂三问咱们来对cat命令,试试这个灵魂三问 `whatis cat whereis cat which cat ` 有了这三个命令咱们就能够理解任何命令的根本信息了!咱们再去问问什么命令呢?????下次再说!????上一章010107whereis 参加制作 去做试验 下一章010109clear

August 30, 2020 · 1 min · jiezi

关于linux运维:oeasy教您玩转linux010107那啥在哪-whereis

回顾上次内容 ????上次讲了 ls 的参数 (arguement) 和选项 (option) 的设置。当初咱们要制作这样一个列表:????对于 /proc 门路进行列表对子门路递归列表显示暗藏文件显示详细信息其中容量应用人们熟知的单位大家遗记了吗?!!???? 没关系,咱们能够查手册,???? 那么做完了之后能够思考,ls 到底在哪????? ls 在哪?????想要晓得 ls 在哪就得用新命令 whereis,命令的参数是 ls,综合起来就是: whereis ls咱们能够失去 ls 两个硬盘地位: /bin/ls /usr/share/man/man1/ls.1.gz为什么 ls 在硬盘里?????ls 文件最开始在 /bin 这个地位当我在命令行敲击之后 ls 回车之后操作系统要求运行 ls 程序操作系统分配内存空间给 ls操作系统把 ls 从硬盘加载到内存中操作系统调配 cpu 资源去执行程序最终把 ls 的后果输入到规范输入流(屏幕)上为什么 ls 命令对应两个地位呢 ????咱们能够对 whereis 收回询问: whatis whereiswhereis 能够帮咱们定位命令的地位然而 whereis 形容太简略了,咱们能够查问 whereis 的手册 man:???? man whereis咱们能够查问到 whereis 的具体内容:???? 试试选项的性能whereis -b lsb 的意思是 binary 二进制查找 whereis 二进制二进制文件在/bin 里whereis -mm 的意思是 manual 文档查找 whereis 的文档文档在/usr/share/man 外面总结来说:whereis -b ls 是二进制命令,whereis -m 另一个是帮忙手册。 ...

August 29, 2020 · 1 min · jiezi

服务器-ssh-key-与-git-配置

程序员经常会说一句话: 面向 github 编程,github 对程序员的重要性可见一斑 虽然 git 可以工作在 ssh 与 https 两种协议上,但为了安全性,更多时候会选择 ssh。 如果采用 https,则每次 git push 都需要验证身份所以此篇文章的主要内容是: ssh keygen: 生成非对称加密中的 public-key 与 private-key,并把 publik-key 扔到 github 上。与上篇文章 配置服务器免登陆 一样的步骤你对流程熟悉后,只需要一分钟便可以操作完成原文地址: 服务器 ssh key 以及 git 的配置系列文章: 服务器运维笔记Permission denied (publickey).如果没有设置 public key 直接 git clone 的话,会有权限问题 可以使用 ssh -T 测试连通性 $ git clone git@github.com:vim/vim.gitCloning into 'vim'...Warning: Permanently added the RSA host key for IP address '13.229.188.59' to the list of known hosts.Permission denied (publickey).fatal: Could not read from remote repository.Please make sure you have the correct access rightsand the repository exists.# 不过有一个更直接的命令去查看是否有权限$ ssh -T git@github.comPermission denied (publickey).生成一个新的 ssh key使用 ssh-keygen 可以生成配对的 id_rsa 与 id_rsa.pub 文件 ...

October 17, 2019 · 1 min · jiezi

使用-sed-命令替换删除-文本字符的-20-个例子

简述在以下的文章中会介绍使用 linux sed 命令删除和替换文件中指定字符的 20 个例子。sed 替换字符的命令格式 如下: $ sed 's/find/replace/' file示例文件: $ cat fileLinuxSolarisUbuntuFedoraRedHat 1. 删除指定的字符,比如 'a'$ sed 's/a//' fileLinuxSolrisUbuntuFedorRedHt以上命令会删除每一行匹配到的第一个 'a' 字符,如果要移除每一行的所有 'a' 字符: $ sed 's/a//g' file2. 移除每一行的第一个字符$ sed 's/^.//' fileinuxolarisbuntuedoraedHat. 谁匹配任意的单个字符,^ 指定匹配每一行的开头。以下的命令也可以达到同样的效果 $ sed 's/.//' file因为 sed 命令默认是从开头匹配字符串的,所以使用 . 可以匹配开头的第一个字符。 3. 移除每一行的最后一个字符$ sed 's/.$//' fileLinuSolariUbuntFedorRedHa$ 会匹配每一行字符串的结尾。 4. 同时移除每一行的第一个字符和最后一个字符$ sed 's/^.//;s/.$//' fileinuolaribuntedoredHased命令可以结合多个操作指令,每个指令之间通过';'分割 5. 移除每一行的匹配到的第一个字符,如果没有匹配不做处理$ sed 's/^F//' fileLinuxSolarisUbuntuedoraRedHat以上命令移除了第一个且匹配F的字符 6. 移除每一行的匹配到的最后一个字符,如果没有匹配不做处理$ sed 's/x$//' fileLinuSolarisUbuntuFedoraRedHat以上命令只会删除每一行结尾是 x 的字符 ...

October 8, 2019 · 1 min · jiezi

高性能缓存服务器-nuster-v31019-发布支持硬盘持久化清除缓存文件等

nuster 是一个基于 HAProxy 的高性能 HTTP 缓存服务器和 RESTful NoSQL 缓存服务器,既可以用作类似 Varnish 或者 Nginx 那样的 HTTP 缓存服务器,来缓存动态或者静态的 HTTP 资源,也可以用作 RESTful NoSQL 缓存服务器, 用 HTTP POST/GET/DELETE 来 添加 /取得 /删除 Key/Value。 https://github.com/jiangwenyu... 这次更新主要添加对硬盘持久化的支持 支持四种持久模式 off: 默认模式,仅保存在内存only: 不保存在内存,仅保存在硬盘sync: 保存到内存和硬盘后返回给客户端async: 保存到内存后立即换回给客户的,内存数据会由master进程在一定时间后保存至硬盘配置文件 global master-worker nuster cache on data-size 10m dir /tmp/cache nuster nosql on data-size 10m dir /tmp/nosqlbackend be nuster cache on nuster rule off disk off ttl 1m if { path_beg /disk-off } nuster rule only disk only ttl 1d if { path_beg /disk-only } nuster rule sync disk sync ttl 1h if { path_beg /disk-sync } nuster rule async disk async ttl 2h if { path_beg /disk-async } nuster rule others ttl 100/disk-off 仅保存在内存/disk-only 仅保存在硬盘/disk-sync 保存至内存和硬盘后返回给客户端/disk-async 保存至内存后立即换回给客户端,内存数据会在一定时间后被缓存至硬盘其他的所有请求都仅保存在内存

October 4, 2019 · 1 min · jiezi

制约超级计算机达摩克利斯之剑量子计算机

每一年世界将会评比出新的超级计算机500强和前10名,在这场竞赛当中最吸引人的就是中美两国的博弈,不是中国第一就是美国第一,虽然是博弈但是其主动权一直在美国人手里,因为超级计算机核心运力处理器是美国主导的,其他国家现在还没有能力能抗衡。 超级计算机(集群)不仅造价高昂,伴随而来的还有其对能源的巨大消耗。例如在今年6月发布的超级计算机TOP500榜单上,性能排名第一的Summit超算其功耗达到了10096kW。用我们更为熟悉的说法做个换算,一万度电大概是一个什么概念?以每小时消耗100瓦的个人电脑来做对比,其相当于十万台电脑的耗能;以交通工具来对比,其能耗约等于350公里时速行进的高铁…… 因为超级计算机的消耗巨大,而且产出比虽然很高,但是在量子计算机面前都是渣渣,现在世界量子计算机还处在一个创造期,2019年初,IBM公布了世界上第一台独立量子计算机,名为IBM Q System One。System One结合了量子计算和传统计算方式,通过量子力学可以提供了一个20量子比特的系统。一个屋子体积的设备的运算力,相当于一个大楼的超级计算机设备运算力。 在2019年夏天,华为昆仑量子计算原型机曝光 ,华为昆仑量子计算模拟一体机原型采用了HiQ编程架构;搭载量子计算模拟器和昆仑服务器9032。在实验室状态下,单台昆仑量子计算模拟一体机可以实现:全振幅模拟40量子比特;以及单振福模拟最大144量子比特(22层)的性能表现。这点就是说,我国在量子计算机上将会超越美国,这一点毋庸置疑。 传统公司和个人,在管理自己的服务器集群时,都不知道选用什么样的工具,现在互联网的发展,推出了具有云端化批量管理服务器的平台,旗鱼云梯的管理方式非常简单,只需要用浏览器登录云端,就可以管理自己在各个IDC厂商的服务器,时间一键建站的功能,可以云端化实现安全防护和运维管理。 总结:超级计算机的未来就是超级量子计算机,个人服务器集群未来就是使用旗鱼云梯平台,云端化智能化,是企业和个人建站,管控服务器的好帮手。

July 13, 2019 · 1 min · jiezi

华为鸿蒙基于旗鱼OS开发-我还认识一个旗鱼云梯

据了解近期关于华为鸿蒙操作系统的消息越来越多,而且细节也越来越丰富。不过外媒的一则消息却表示华为鸿蒙操作系统并不是从零开始的。俄罗斯一家媒体表示,华为鸿蒙操作系统是基于旗鱼 OS进行开发的,之所以能够兼容安卓,也正是这个原因。 旗鱼 OS是诺基亚放弃MeeGo的继承者,基于MeeGo开发出旗鱼 OS。在华为正式公布鸿蒙操作系统的细节之前,还无法确定鸿蒙操作系统是完全自研还是基于已有成果之上。不过从前段时间的信息来看,鸿蒙完全自研的可能性是比较大的。另一个我知道的旗鱼云梯是建站平台,可以再linux系统上一键建站,帮助企业和站长实现一键建站能力.旗鱼云梯是批量化linux服务器集群管理平台,可以快速搭建web环境,让用户最快的建立网站.都是旗鱼os系统,旗鱼云梯你咋这么优秀呢.作为linux面板建站来说.

July 10, 2019 · 1 min · jiezi

linux重置root密码

环境:centos7 1.通过开机修改内核引导重置重启linux系统主机并出现引导界面时,按下E键进入内核编辑界面在linux16参数这行的最后追加"rd.break"参数,然后按下Crtl + X 来运行修改过的内核参数之后,系统进入紧急救援模式输入以下命令,等待系统重启即可完成修改 mount -o remount,rw /sysrootchroot /sysrootpasswdtouch /.autorelabelexitreboot 2.通过光盘救援模式修改开机时选光驱引导,选Troubleshooting,后选择Rescue a Centos system,选1继续,进入救援模式进入救援模式后,此时系统已被挂载到/mnt/sysimage路径上,我们可以通过修改原系统的/etc/shadow文件来重置root密码 vi /mnt/sysimage/etc/shadow将shadow文件第一行root的第二个字段删除,然后wq!保存重启系统,此时root可以无密码登录,再用passwd命令创建密码即可

July 7, 2019 · 1 min · jiezi

Linux运维shell脚本3

总结一下碰到过的shell脚本。1、统计进程占用内存大小写一个脚本计算一下linux系统所有进程占用内存大小的和。 #!/bin/bashsum=0for mem in `ps aux | awk '{print $6}' | grep -v 'RSS'`do sum=$[$sum + $mem]doneecho "The total memory is $sum"2、批量创建用户写一个脚本实现:添加user_00-user-09总共10个用户,并且对这10个用户设置一个随机密码,密码要求10位包含大小写字母以及数字,最后将每个用户的密码记录到一个日志文件里。 #!/bin/bashfor i in `seq -w 0 09`do useradd user_$i p=`mkpasswd -s 0 -l 10` echo "user_$i $p" >> /tmp/user0_9.pass echo $p |passwd --stdin user_$idone3、URL检测脚本编写shell脚本检测URL是否正常。 #!/bin/bash. /etc/init.d/functionsfunction usage(){ echo $"usage:$0 url" exit 1}function check_url(){ wget --spider -q -o /dev/null --tries=1 -T 5 $1 if [ $? -eq 0 ];then action "$1 is yes." /bin/true else action "$1 is no." /bin/false fi}function main(){ if [ $# -ne 1 ];then usage fi check_url $1}main $*测试结果: ...

July 1, 2019 · 1 min · jiezi

ansible-从-2711-升级到-281-产生的问题处理办法

配置文件变化导致读不到 inventory,同时使用两种格式可以兼容各个版本,如下 cat .ansible.cfg[defaults]# inventory control group_vars# < 2.8hostfile = xxx# >=2.8inventory = xxxansible 内置变量变化ansible_distribution_version 在 centos 上在 2.7.11 和 2.8.1 结果不同,导致相同的 playbook 在升级 ansible 后无法正常运行 观察 ubuntu 和 centos 的相关变量如下,最终采用ansible_lsb.release来代替ansible_distribution_version ,可以加绒Ubuntu 和 centos 中ansible 的各个版本。 # on ubuntu trusty## ansible 1.5.4root@iZhp33qecbruyuw1awh6rfZ:~# ansible localhost -m setup -a "filter=ansible_os_family"localhost | success >> { "ansible_facts": { "ansible_os_family": "Debian" }, "changed": false}root@iZhp33qecbruyuw1awh6rfZ:~# ansible localhost -m setup -a "filter=ansible_distribution_version"localhost | SUCCESS => { "ansible_facts": { "ansible_distribution_version": "14.04" }, "changed": false}root@iZhp33qecbruyuw1awh6rfZ:~# ansible localhost -m setup -a "filter=ansible_lsb"localhost | success >> { "ansible_facts": { "ansible_lsb": { "codename": "trusty", "description": "Ubuntu 14.04.5 LTS", "id": "Ubuntu", "major_release": "14", "release": "14.04" } }, "changed": false}## ansible 2.8.1root@iZhp33qecbruyuw1awh6rfZ:~# ansible localhost -m setup -a "filter=ansible_os_family"localhost | SUCCESS => { "ansible_facts": { "ansible_os_family": "Debian" }, "changed": false}root@iZhp33qecbruyuw1awh6rfZ:~# ansible localhost -m setup -a "filter=ansible_distribution_version"localhost | SUCCESS => { "ansible_facts": { "ansible_distribution_version": "14.04" }, "changed": false}root@iZhp33qecbruyuw1awh6rfZ:~# ansible localhost -m setup -a "filter=ansible_lsb"localhost | success >> { "ansible_facts": { "ansible_lsb": { "codename": "trusty", "description": "Ubuntu 14.04.5 LTS", "id": "Ubuntu", "major_release": "14", "release": "14.04" } }, "changed": false}# on centos 7.5## ansible 2.7.11[root@node11 ~]# ansible localhost -m setup -a "filter=ansible_os_family"localhost | SUCCESS => { "ansible_facts": { "ansible_os_family": "RedHat" }, "changed": false}[root@node11 ~]# ansible localhost -m setup -a "filter=ansible_distribution_version"localhost | SUCCESS => { "ansible_facts": { "ansible_distribution_version": "7.5.1804" }, "changed": false}[root@node11 ~]# ansible localhost -m setup -a "filter=ansible_lsb"localhost | SUCCESS => { "ansible_facts": { "ansible_lsb": { "codename": "Core", "description": "CentOS Linux release 7.5.1804 (Core)", "id": "CentOS", "major_release": "7", "release": "7.5.1804" } }, "changed": false}## ansible 2.8.1[root@node11 ~]# ansible localhost -m setup -a "filter=ansible_os_family"localhost | SUCCESS => { "ansible_facts": { "ansible_os_family": "RedHat", "discovered_interpreter_python": "/usr/bin/python" }, "changed": false}[root@node11 ~]# ansible localhost -m setup -a "filter=ansible_distribution_version"localhost | SUCCESS => { "ansible_facts": { "ansible_distribution_version": "7" }, "changed": false}[root@node11 ~]# ansible localhost -m setup -a "filter=ansible_lsb"localhost | SUCCESS => { "ansible_facts": { "ansible_lsb": { "codename": "Core", "description": "CentOS Linux release 7.5.1804 (Core)", "id": "CentOS", "major_release": "7", "release": "7.5.1804" } }, "changed": false}

June 27, 2019 · 2 min · jiezi

vsftpd安装配置

一.简介 vsftpd 是linux上的一款强大ftp服务器,可配置为2种模式:PASV(被动模式)和PORT(主动模式)。2种模式在建立控制通道的时候是完全一样的,但是在数据通道的建立上有所不同。被动模式(推荐)下在数据通道建立的时候,服务器被动开放随机端口(可限定)让客户端来连接,从而建立数据通道。而主动模式(默认)下在建立数据通道时,服务器主动通过客户端发出的端口信息建立数据通道。 二.步骤 yum -y install vsftpd //yum安装 mkdir /home/dev/ftpfile //创建ftp共享文件夹 useradd cyl -d /ftpfile -s /sbin/nologin //创建虚拟用户,为了安全起见,不给登录权限 chown -R cyl.cyl /home/dev/ftpfile //修改文件夹权限 passwd cyl 111111 //重设密码 cd /etc/vsftpd vim chroot_list //用户列表 vim /etc/selinux/config 修改为SELINUX=disabled //启用ftp支持 reboot //重启服务器 vim /etc/vsftpd/vsftpd.conf //修改配置项 配置防火墙: 重启防火墙和vsftpd 访问后报错:500 OOPS: cannot change directory:/home/dev/ftpfile/ 修改dev文件夹权限:chmod 777 dev 本人创业团队产品MadPecker,主要做BUG管理、测试管理、应用分发网址:www.madpecker.com,有需要的朋友欢迎试用、体验!本文为MadPecker团队技术人员编写,转载请标明出处

June 25, 2019 · 1 min · jiezi

Linux常识篇2理解inode与软硬链接

inode是什么?理解inode,要从文件储存说起。文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sector)。每个扇区储存512字节(相当于0.5KB)。 操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个"块"(block)。这种由多个扇区组成的"块",是文件存取的最小单位。"块"的大小,最常见的是4KB,即连续八个 sector组成一个 block。 文件数据都储存在"块"中,那么很显然,我们还必须找到一个地方储存文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。这种储存文件元信息的区域就叫做inode,中文译名为"索引节点"。 inode的内容inode包含文件的元信息,具体来说有以下内容: 文件的字节数文件拥有者的User ID文件的Group ID文件的读、写、执行权限文件的时间戳,共有三个:ctime,mtime,atime。具体的可以查看我另外一篇博文链接数,即有多少文件名指向这个inode文件数据block的位置# 通过stat可以查看文件的inode信息[root@localhost ~]# stat log_file File: ‘log_file’ Size: 56952669 Blocks: 111240 IO Block: 4096 regular fileDevice: fd00h/64768d Inode: 74004187 Links: 1Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)Access: 2015-08-25 12:42:14.352918880 +0800Modify: 2015-08-21 14:46:54.000000000 +0800Change: 2015-08-24 10:57:43.525126478 +0800 Birth: -总之,除了文件名以外的所有文件信息,都存在inode之中。至于为什么没有文件名,下文会有详细解释 inode的大小inode也会消耗硬盘空间,所以硬盘格式化的时候,操作系统自动将硬盘分成两个区域。一个是数据区,存放文件数据;另一个是inode区(inode table),存放inode所包含的信息。每个inode节点的大小,一般是128字节或256字节。inode节点的总数,在格式化时就给定,一般是每1KB或每2KB就设置一个inode。假定在一块1GB的硬盘中,每个inode节点的大小为128字节,每1KB就设置一个inode,那么inode table的大小就会达到128MB,占整块硬盘的12.8%。 查看每个硬盘分区的inode总数和已经使用的数量,可以使用df命令。 [root@localhost ~]# df -iFilesystem Inodes IUsed IFree IUse% Mounted on/dev/mapper/centos-root 27754496 117438 27637058 1% /devtmpfs 124824 332 124492 1% /devtmpfs 127185 1 127184 1% /dev/shmtmpfs 127185 358 126827 1% /runtmpfs 127185 13 127172 1% /sys/fs/cgroup/dev/sda1 512000 330 511670 1% /boot查看每个inode节点的大小,可以用如下命令: ...

June 15, 2019 · 1 min · jiezi

Linux运维记录几道笔试题

统计web日志中IP访问次数有一个大于10G的apache访问日志,要求找出访问/stat.php页面次数大于1000次的前100个IP日志样本如下: 212.11.129.182 - [26/Mar/2015:03:00:01 +0800] "GET/stat.php?pid=016 HTTP/1.1" 302 20-"-" "-" ""Mozllia/4.0(compatible;MSIE 6.0;Windows NT 5.1)"解析:10G的日志已经很大了,直接使用grep或者awk进行分析会很慢,对服务器内存消耗大,如果服务器配置低,可以考虑把日志切割,比如切割成100个100M的文件,然后针对这100个文件分别进行统计排名前100的IP,得出结果后合并到一个文件中,再进一步分析。答案: #!/bin/bashsta(){ grep '/stat.php' $1|awk '{print $1}' | sort -n |unic -n|sort -n|tail -100}logfile=/data/logs/access.logmkdir /data/logs/tmpcd /data/logs# 分割成100个100M的文件split -b 100M access.log smallfilemv smallfile* tmpcd tmp# 把分割后的文件中的ip前100个计算出来for f in `ls smallfile*`do sta $f >> top100.txtdone# 编写函数,计算每个IP出现的次数count_sum(){ sum=0 for f in `ls smallfile*` do n=`grep "$1" $f|wc -l` sum=$[$sum+$n] echo $sum $1 done}# 把得到的IP进行去重,作为遍历对象,把所有出现的IP次数统计出来for ip in `awk '{print $2}' top100.txt|sort -n|uniq`do count_sum $ip >> ip.txtdone# 先把IP大于1000次的过滤出来,然后按照IP次数进行排序,得到前100个awk '$1>1000' ip.txt|sort -nr|head -100find命令题:写一个脚本或者一条命令查找/var/log目录下,最后修改时间大于30天,后缀为*.log的文件并删除。答: ...

June 7, 2019 · 1 min · jiezi

在linux上配置smb服务

安装smb服务:sudo yum install smb修改/etc/samba/smb.conf:[global]workgroup = WORKGROUPserver string = Samba Server Version %vsecurity = userpassdb backend = tdbsam[aqui]path = /home/aquivalid users = aquiguest ok = nowritable = nobrowsable = yes中括号里的aqui是盘符 设置开机自启和重启服务sudo systemctl enable smbsudo systemctl restart smb

May 31, 2019 · 1 min · jiezi

U盘自动加载

设置devlabel规则每次USB插入时,linux创建的设备文件可能不一样,有时候是/dev/sdb1有时候是/dev/sdc1,可以用fdisk -l命令查看。所以需要为usb建立label不管设备文件是哪个,都有一个固定的label的连接指向它。先用udevadm info -a -p $(udevadm info -q path -n /dev/sdb1)查看U盘信息,再在/etc/udev/rules.d/下面新建一个文件如:11-usb-serial.rules,写入: DRIVERS=="usb", SYMLINK+="usb"如果希望做更多的限制,可以参考Writing udev rules这样每次U盘插入时就会生成一个如下的软连接: lrwxrwxrwx 1 root root 4 May 31 12:34 /dev/usb -> sdb1设置自动加载安装autofs工具:sudo yum install autofs配置/etc/auto.master: ## Sample auto.master file# This is a 'master' automounter map and it has the following format:# mount-point [map-type[,format]:]map [options]# For details of the format look at auto.master(5).#/home/aqui/mnt /etc/auto.usb## NOTE: mounts done from a hosts map will be mounted with the# "nosuid" and "nodev" options unless the "suid" and "dev"# options are explicitly given.##/net -hosts## Include /etc/auto.master.d/*.autofs# The included files must conform to the format of this file.#+dir:/etc/auto.master.d## Include central master map if it can be found using# nsswitch sources.## Note that if there are entries for /net or /misc (as# above) in the included master map any keys that are the# same will not be seen as the first read key seen takes# precedence.#+auto.master新建/etc/auto.usb: ...

May 31, 2019 · 1 min · jiezi

Linux运维mysql数据库的备份与恢复

运维工程师的日常工作需要对各种数据进行备份,其中数据库数据的备份当属重点之一,为了方便管理,选择哪种备份方案是很重要的。数据备份种类全量备份全量备份就是指对某一个时间点上的所有数据或应用进行的一个完全拷贝。实际应用中就是用一盘磁带对整个系统进行全量备份,包括其中的系统和所有数据。 特点 备份的数据全面而且最为完整数据量大的时候备份时间长备份数据会存在大量重复信息增量备份增量备份是指在一次全备份或上一次增量备份后,以后每次的备份只需备份与前一次相比增加或者被修改的文件。这就意味着,第一次增量备份的对象是进行全备后所产生的增加和修改的文件;第二次增量备份的对象是进行第一次增量备份后所产生的增加和修改的文件,如此类推。 特点 与全量备份相比,没有重复的备份数据备份数据量不大,备份恢复的时间短数据恢复麻烦,必须具有上一次全备份和所有增量备份磁带,并且需要按照全量备份到增量备份的顺序反推进行恢复差异备份差异备份是指在一次全备份后到进行差异备份的这段时间内,对那些增加或者修改文件的备份。 特点 备份时间短,节省磁盘空间恢复所需的磁带少,恢复时间短比较数据备份的数据量(大>>小):全量备份>差异备份>增量备份 数据的恢复时间(快>>慢):全量备份->差异备份->增量备份 mysql数据库备份工具mysqldump工具mysqldump是一款mysql逻辑备份的工具,它将数据库里面的对象(表)导出作为SQL脚本文件。它是mysql备份常用的备份方法,适合于不同版本mysql之间的升级、迁移等,不过在数据库比较大的时候,效率不高。 下面是mysqldump命令的常见用法: # 备份单个的数据库,如备份db1这个数据库mysqldump -uroot -p123456 db1 > /backup/db1_`date +%F`.sql# 备份所有数据库,-A参数mysqldump -uroot -p123456 -A > /backup/all_db.sql# 备份远程主机的数据库,-h指定IP地址,-P(大写P)指定端口mysqldump -uroot -p123456 -h192.168.30.4 -P3306 db1 > /backup/db1.sql# 只备份表结构,不备份数据,使用-d参数mysqldump -uroot -p123456 -d db1 > /backup/db1.sql# 只备份数据,不备份表结构,使用-t参数mysqldump -uroot -p123456 -t db1 > /backup/db1.sql # 备份指定的多个库,-B参数mysqldump -uroot -p123456 -B db1 db2 db3 > /backup/db123.sql# 备份指定的表,如备份db1库里面的stu表mysqldump -uroot -p123456 db1 stu > /backup/db1_stu.sql# 备份多个表mysqldump -uroot -p123456 库1 表1 表2 表3... > db_tables.sql# 恢复数据mysqldump -uroot -p123456 dbname < xxx.sql#或者mysqldump -uroot -p123456 < xxx.sql其他参数: ...

May 27, 2019 · 1 min · jiezi

版本控制系统Git笔记

git介绍Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目,它最初是由Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件并且它采用了分布式版本库的方式,不必服务器端软件支持。 git官网git的官网:https://git-scm.com/ git的功能Git作为一个版本控制工具,它具备的功能如下: 协同修改:多人可以并行不悖地修改服务器端的同一文件;数据备份:可以保存文件或者目录的当前状态,也可以保存每一个提交过的历史状态;版本管理:Git 采取了文件系统快照的方式,在保存每一个版本的文件信息的时候做到不保存重复数据,以节约存储空间,提高运行效率。权限控制:对开发团队的人员进行权限控制,对团队开发者贡献的代码进行审核;历史记录:可以查看修改人员、修改时间、修改内容、日志信息,可以将本地文件恢复到某一个历史状态;分支管理:允许开发团队在工作过程中多条生产线同时推进任务,进一步提高效率。git的优势 大部分操作都在本地完成,不需要联网;完整性保证;尽可能添加数据而不是删除或修改数据;分支操作非常快捷流畅;与Linux命令完全兼容。git的安装Linux系统安装1. 环境说明:使用的是Centos7系统,防火墙为关闭状态。 [root@moli_linux1 ~]$ rpm -qa centos-releasecentos-release-7-5.1804.el7.centos.2.x86_64[root@moli_linux1 ~]$ uname -aLinux moli_linux1 3.10.0-862.6.3.el7.x86_64 #1 SMP Tue Jun 26 16:32:21 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux[root@moli_linux1 ~]$ getenforceDisabled[root@moli_linux1 ~]$ systemctl status firewalld.service● firewalld.service - firewalld - dynamic firewall daemon Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled) Active: inactive (dead) Docs: man:firewalld(1)2. yum安装gitCentOS系统中自带了git包,可直接使用yum命令进行安装 [root@moli_linux1 ~]$ rpm -qa gitgit-1.8.3.1-20.el7.x86_64 # 自带的git版本为1.8.3[root@moli_linux1 ~]$ yum install -y git # 进行安装3. 编译安装如果觉得自带的git版本过低,需要安装较新版本的git软件,可以使用编译安装的方法。首先,去github上下载源码包,地址:https://github.com/git/git/re... ...

April 25, 2019 · 2 min · jiezi

cut命令、sort命令、uniq命令使用

cut命令含义正如cut的中文意思,cut的工作就是“剪”,具体来说是在文件负责剪切数据用的,它以每一行为一个处理对象,与sed的机制是一样的。剪切依据cut命令主要是接受三个定位方法:第一,字节(bytes),用选项-b第二,字符(characters),用选项-c第三,域(fields),用选项-f语法格式cut [-bn] [file] 或 cut [-c] [file] 或 cut [-df] [file]使用说明cut命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段写至标准输出。如果不指定 File 参数,cut 命令将读取标准输入。必须指定 -b、-c 或 -f 标志之一。主要参数-b :以字节为单位进行分割。这些字节位置将忽略多字节字符边界,除非也指定了 -n 标志。-c :以字符为单位进行分割。-d :自定义分隔符,默认为制表符。-f :与-d一起使用,指定显示哪个区域。-n :取消分割多字节字符。仅和 -b 标志一起使用。如果字符的最后一个字节落在由 -b 标志的 List 参数指示的范围之内,该字符将被写出;否则,该字符将被排除。常用示例:“字节”定位中,提取第1到第5和第10个字节,-b支持形如1-5的写法,而且多个定位之间用逗号隔开注意,cut命令如果使用了-b选项,那么执行此命令时,cut会先把-b后面所有的定位进行从小到大排序,然后再提取。示例1:提取第1到第5字节和第10个字节的内容[root@moli_linux1 ~]$ echo “abcde12345” | cut -b 1-5,10abcde5示例2:-3表示从第1个字节到第3个字节,3-表示从第3个字节到行尾[root@moli_linux1 ~]$ echo “abcde54321” | cut -b -3abc[root@moli_linux1 ~]$ echo “abcde54321” | cut -b 3-cde54321示例3:多字节字符处理1个空格算1个字节,而1个汉字算3个字节,因此汉字是多字节字符.遇到多字节字符可以使用-c选项,也可以使用-b选项,不过要结合-n选项,-n选项告诉cut命令不要将多字节字符拆开。[root@moli_linux1 ~]$ cat cut_test2.txt 星期一aa星期二bb星期三cc[root@moli_linux1 ~]$ cut -b 3 cut_test2.txt # 因为没加-n选项,因此将"星"字给拆分了.. [root@moli_linux1 ~]$ cut -nb 3 cut_test2.txt # 切割第3个字符一二三[root@moli_linux1 ~]$ cut -c 3 cut_test2.txt 一二三[root@moli_linux1 ~]$ cut -c 4,5 cut_test2.txt aabbcc[root@moli_linux1 ~]$ cut -nb 4,5 cut_test2.txt aabbcc 示例4:对于非固定格式的文档,使用-f选项来定义域来切割文件[root@moli_linux1 ~]$ head -n 5 /etc/passwd > cut_test.txt[root@moli_linux1 ~]$ cat cut_test.txt root❌0:0:root:/root:/bin/bashbin❌1:1:bin:/bin:/sbin/nologindaemon❌2:2:daemon:/sbin:/sbin/nologinadm❌3:4:adm:/var/adm:/sbin/nologinlp❌4:7:lp:/var/spool/lpd:/sbin/nologin[root@moli_linux1 ~]$ cut -d “:” -f 1-3,5 cut_test.txt root❌0:rootbin❌1:bindaemon❌2:daemonadm❌3:admlp❌4:lp上面的cut -d “:” -f 1-3,5 cut_test.txt 中,-d选项指定:为分割符,每个分隔符作为一个域,-f后面的数字指定切割哪个域,这里1-3,5表示截取第1,2,3和第5个域。sort命令说明sort命令将文件进行排序,并将排序结果标准输出。sort命令既可以从特定的文件,也可以从stdin中获取输入。工作原理sort将文件的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出。语法sort(选项)(参数)常用选项-u:unique 唯一,排序并且排除重复项-n: number 按照数字进行排序,默认数字会被当作字符串进行比较,字符或者其他特殊符号会被当做0排在数字前面-r:反向排序-b:忽略每行前面开始出的空格字符示例1:-u选项[root@moli_linux1 ~]$ cat sort_test.txt helloworld>>>hello12345shell??? have a space[root@moli_linux1 ~]$ sort -u sort_test.txt # 去除重复hello并排序>>>???12345 have a spacehelloshellworld示例2:-n选项。按照数字进行排序,默认数字会被当作字符串进行比较,字符或者其他特殊符号会被当做0排在数字前面[root@moli_linux1 ~]$ cat sort_test2.txt 987124123234???hello123[root@moli_linux1 ~]$ sort -n sort_test2.txt ???hello123123124234987示例3:反向排序-r[root@moli_linux1 ~]$ cat sort_test2.txt 987124123234???hello123[root@moli_linux1 ~]$ sort -rn sort_test2.txt 987234124123123hello???uniq命令说明uniq命令用于报告或忽略文件中的重复行,一般与sort命令结合使用。对于uniq来说,去除重复的内容,内容之间必须相邻,不然无法去除。因此多先用sort排序,再用uniq去重。语法uniq(选项)(参数)常用选项-c:在每列旁边显示该行重复出现的次数-d: 仅显示重复出现的行列;示例1[root@moli_linux1 ~]$ cat uniq.txt helloworldhellopython1123[root@moli_linux1 ~]$ uniq uniq.txt # 只会去除相邻的重复内容数字1,不相邻的重复内容hello不会被删除helloworldhellopython123示例2,结合sort删除所有重复内容[root@moli_linux1 ~]$ sort uniq.txt |uniq123hellopythonworld示例3:统计各行在文件中出现的次数[root@moli_linux1 ~]$ sort uniq.txt |uniq -c 2 1 1 2 1 3 2 hello 1 python 1 world示例4:找出文件中重复的行[root@moli_linux1 ~]$ sort uniq.txt |uniq -d1hello总结:这三个命令经常在shell脚本中使用,除了grep,sed,awk三个之外,也需要熟练掌握。 ...

April 8, 2019 · 1 min · jiezi

防火墙管理工具iptables

防火墙防火墙作为一种内部网与外部网之间的访问控制设备,通常安装在内部网络与外部网络的边际,防火墙具有很好的网络保护作用。入侵者必须先通过防火墙的安全防线才能接触计算机。可以将防火墙配置不同的安全级别,达到不同的安全防护。iptables与netfilter的关系netfilter/iptables是集成在Linux2.4x版本内核中的包过滤防火墙系统。它可以实现数据包过滤,网络地址转换以及数据包管理功能。Linux中的防火墙系统中,netfilter位于内核空间,负责对本机所有流入,流出,转发的数据包进行查看,修改,丢弃,拒绝等操作,由于netfilter位于内核空间,用户一般无法接触内核和修改内核,所以就需要一些命令行工具进行管理,常用的有iptables,firewalld等工具。因此,真正实现防火墙功能的是netfilter,它是Linux内核中实现包过滤的内部结构。iptables结构简单来说,iptables是由表组成,表是链的集合,链上有规则。如果将iptables比作一栋楼,那么表、链、规则是:iptables表(tables)链(chains)规则(policy)大楼每一层楼一层楼的房间房间内的布局iptables中有四表五链表作用filter实现数据包的过滤(常用)nat修改数据包的地址和端口(常用)mangle修改数据包的服务类型、TTL、并且可以配置路由实现QOS内核模块(用得不多)raw决定数据包是否被状态跟踪机制处理(用得不多)而链分别是:PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING。filter表的链filter表是iptables默认的表,有3条链,分别是INPUT、FORWARD和OUTPUT链。INPUT:对于指定到本地套接字的包,即到达本地防火墙服务器的数据包。FORWARD:路由穿过的数据包,即经过本地防火墙服务器的数据包。OUTPUT:本地创建的数据包nat表的链对于nat表来说有3条链,分别是PREROUTING、OUTPUT和POSTROUTING链。PREROUTING:所有的数据包进来的时侯都先由这个链处理OUTPUT:本地创建的数据包在路由前进行改变POSTROUTING:在数据包即将出去时改变数据包信息,所有的数据包出来的时侯都先由这个链处理iptables工作流程当一个数据包进入网卡时,当一个数据包进入网卡时,它首先进入PREROUTING链,内核根据数据包目的IP判断是否需要转送出去。如果数据包就是进入本机的,它就会沿着图向上移动,到达INPUT链。数据包到了INPUT链后,任何进程都会收到它。本机上运行的程序可以发送数据包,这些数据包会经过OUTPUT链,然后到达POSTROUTING链输出。如果数据包是要转发出去的,且内核允许转发,数据包就会如图所示向右移动,经过FORWARD链,然后到达POSTROUTING链输出。规则表之间的优先顺序:Raw>mangle>nat>filter规则链的优先顺序分3种情况入站数据流向从外界到达防火墙的数据包,先被PREROUTING规则链处理(是否修改数据包地址等),之后会进行路由选择(判断该数据包应该发往何处),如果数据包的目标主机是防火墙本机(比如说Internet用户访问防火墙主机中的web服务器的数据包),那么内核将其传给INPUT链进行处理(决定是否允许通过等),通过以后再交给系统上层的应用程序(比如Apache服务器)进行响应。转发数据流向来自外界的数据包到达防火墙后,首先被PREROUTING规则链处理,之后会进行路由选择,如果数据包的目标地址是其它外部地址(比如局域网用户通过网 关访问QQ站点的数据包),则内核将其传递给FORWARD链进行处理(是否转发或拦截),然后再交给POSTROUTING规则链(是否修改数据包的地 址等)进行处理。出站数据流向防火墙本机向外部地址发送的数据包(比如在防火墙主机中测试公网DNS服务器时),首先被OUTPUT规则链处理,之后进行路由选择,然后传递给POSTROUTING规则链(是否修改数据包的地址等)进行处理。工作流程小结:1、防火墙是一层层过滤的。实际是按照配置规则的顺序从上到下,从前到后进行过滤的。2、如果匹配上了规则,即明确表明是阻止还是通过,此时数据包就不在向下匹配新规则了。3、如果所有规则中没有明确表明是阻止还是通过这个数据包,也就是没有匹配上规则,向下进行匹配,直到匹配默认规则得到明确的阻止还是通过。4、防火墙的默认规则是对应链的所有的规则执行完以后才会执行的(最后执行的规则)。iptables语法iptables的语法命令格式:iptables -t [表名] 命令选项 [链名] 匹配参数 [-j目标动作]说明:表名和链名:用于指定iptables操作的是哪个表哪条链命令选项:用于指定管理iptables规则的方式(增加,删除等)匹配参数:用于指定对符合什么条件的数据包进行处理目标动作:用于指定对数据包的处理选项:-t:指定需要维护的防火墙规则表,不使用-t时,默认操作filter表命令选项:-A:追加防火墙规则-D:删除防火墙规则-I:插入防火墙规则-F:清空防火墙规则-L:列出防火墙规则-R:替换防火墙规则-Z:清空防火墙数据表统计信息-P:设置链默认规则匹配参数[!] -P:匹配协议,!代表取反即不匹配[!] -s:匹配源地址[!] -d:匹配目标地址[!] -i:匹配入站网卡接口[!] -o:匹配出站网卡接口[!] –sport:匹配源端口[!] –dport:匹配目标端口[!] –src-range:匹配源地址范围[!] –dst-range:匹配目标地址范围[!] –limit:匹配数据表速率[!] –mac-source:匹配源MAC地址[!] –sports:匹配源端口[!] –dports:匹配目标端口[!] –state:匹配状态[!] –string:匹配应用层字串目标动作ACCEPT:允许数据包通过DROP:丢弃数据包REJECT:拒绝数据包通过LOG:将数据包信息记录syslog日志DNAT:目标地址转换SNAT:源地址转换MASQUERADE:地址欺骗REDIRECT:重定向iptables的保存默认的iptables防火墙规则会立刻生效,但如果不保存,当计算机重启后所有的规则都将丢失,所以对防火墙规则进行及时的保存操作是有必要的。备份工具:iptables-save > /etc/sysconfig/iptables还原工具:iptables-restore < /etc/sysconfig/iptables或者执行service iptables save也行。iptables常见规则示例1、查看filter表的所有规则iptables -nL2、查看nat表的所有规则iptables -t nat -nL3、清空filter表的所有规则iptables -t filter -F4、往filter表添加一条规则,丢弃192.168.0.1主机发给本机的所有数据包iptables -t filter -A INPUT -s 192.168.0.1 -j DROP5、往filter表插入一条规则,拒绝192.168.0.2主机ping本机iptables -I INPUT -s 192.168.0.2 -p icmp -j REJECT 6、查看filter表中防火墙规则并显示规则编号iptables -nL –line-number7、删除filter表中INPUT链的第一条规则iptables -D INPUT 18、替换filter表INPUT链的第二条规则,拒绝除了192.168.0.3之外的任何主机连接本机iptables -R INPUT 2 ! -s 192.168.0.3 -j REJECT9、修改filter表INPUT链的默认规则为接收数据包iptables -P INPUT ACCEPT10、禁止来自10.0.0.188 ip地址访问80端口的请求 iptables -A INPUT -s 10.0.0.188 -p tcp –dport 80 -j DROP11、实现把访问10.0.0.3:80的请求转到172.16.1.17:80 iptables -t nat -A PREROUTING -d 10.0.0.3 -p tcp –dport 80 -j DNAT –to-destination 172.16.1.6:8012、只允许远程主机访问本机的80端口 iptables -A INPUT -p tcp –dport 80 -j ACCEPT iptables -A INPUT -p tcp -j DROP13、实现172.16.1.0/24段所有主机通过124.32.54.26外网IP共享上网。iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j SNAT –to-source 124.32.54.26 iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j MASQUERADE 14、允许任意客户端访问服务主机提供的日常服务(HTTP,HTTPS,DNS,NTP,SMTP,POP3)iptables -A INPUT -p udp –dport 25 -j ACCEPTiptables -A INPUT -p udp –dport 53 -j ACCEPTiptables -A INPUT -p tcp –dport 53 -j ACCEPTiptables -A INPUT -p tcp –dport 80 -j ACCEPTiptables -A INPUT -p tcp –dport 110 -j ACCEPTiptables -A INPUT -p tcp –dport 143 -j ACCEPTiptables -A INPUT -p tcp –dport 443 -j ACCEPTiptables -P INPUT DROPiptables -P OUTPUT ACCEPT15、禁止任何主机访问本机22端口iptables -A INPUT -p tcp -dport 22 -j DROP ...

April 7, 2019 · 1 min · jiezi

Redis笔记1-数据类型和持久化策略

NoSQL概述为什么会出现NoSQL单机Mysql的年代,网站大多是静态网页,动态交互性网站不多,一个网站的访问量不大,用单个数据库足以应付。这种单机架构的网站,数据存储的瓶颈分为:数据量的总大小,一个机器放不下一个机器的内存放不下数据库的索引访问量一个数据库承受不了解决这种问题的技术也随之发展,比如:Memcached(缓存)+Mysql+垂直拆分Mysql主从读写分离分表分库+水平拆分+mysql集群Mysql的扩展性瓶颈Mysql数据库经常存储一些大文本字段,导致数据库表非常大,在做数据恢复就会很慢,不容易快速恢复数据库。关系型数据库很强大,但是不能应对所有的应用场景。如今是大数据年代,大数据下IO压力大,表结构更改困难,因此需要引入Nosql。NoSQL是什么NoSQL (= Not Only SQL),意为不仅仅是SQL。泛指非关系型数据库。随着web2.0网站的兴起,传统数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站显得力不从心,而非关系型数据库则由于其本身的特点得到迅速地发展。NoSql数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其大数据应用难题等。NoSql特性NoSQL种类繁多,但都有一个特点就是去掉了关系型数据库的关系特性。数据之间无关系,易扩展读写性能高多样灵活的数据模型,可以随时存储自定义的数据格式分类NoSql四大分类,分为:k-v键值文档型数据库列存储数据库图关系数据库redis入门介绍简介REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统。Redis是一个开源的使用ANSIC语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Hash), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。特性支持数据持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载使用;读写性能高,支持多种数据类型;支持弱事务,消息队列、消息订阅;支持高可用,支持分布式分片集群。安装官网:https://redis.io官方下载地址:http://download.redis.io/rele…redis命令大全:http://redisdoc.com系统环境[root@moli_linux1 ~]# cat /etc/redhat-release CentOS Linux release 7.5.1804 (Core) [root@moli_linux1 ~]# uname -r3.10.0-862.6.3.el7.x86_64[root@moli_linux1 ~]# hostname -I192.168.30.3 安装redis[root@moli_linux1 ~]# cd /usr/local/src/[root@moli_linux1 src]# wget http://download.redis.io/releases/redis-4.0.10.tar.gz[root@moli_linux1 src]# tar -zxvf redis-4.0.10.tar.gz [root@moli_linux1 src]# mv redis-4.0.10 /usr/local/redis[root@moli_linux1 src]# cd !$cd /usr/local/redis[root@moli_linux1 redis]# make至此安装完毕。安装完的命令在/usr/local/bin下[root@moli_linux1 redis]# ll /usr/local/bin/总用量 67304-rwxr-xr-x. 1 root root 14413648 5月 19 2018 cmake-rwxr-xr-x. 1 root root 15543936 5月 19 2018 cpack-rwxr-xr-x. 1 root root 16574056 5月 19 2018 ctest-rwxr-xr-x 1 root root 2451240 7月 8 2018 redis-benchmark-rwxr-xr-x 1 root root 5768672 7月 8 2018 redis-check-aof-rwxr-xr-x 1 root root 5768672 7月 8 2018 redis-check-rdb-rwxr-xr-x 1 root root 2617272 7月 8 2018 redis-clilrwxrwxrwx 1 root root 12 7月 8 2018 redis-sentinel -> redis-server-rwxr-xr-x 1 root root 5768672 7月 8 2018 redis-server拷贝配置文件,并以新的配置文件启动redis[root@moli_linux1 redis]$ cp redis.conf /etc/[root@moli_linux1 redis]$ vim /etc/redis.conf# 修改daemonize no为daemonize yes[root@moli_linux1 redis]$ redis-server /etc/redis.conf # 启动redis[root@moli_linux1 redis]$ ps aux | grep redis #查看进程[root@moli_linux1 redis]$ netstat -lntp | grep redis-server客户端连接redis[root@moli_linux1 redis]$ redis-cli -p 6379127.0.0.1:6379>基础知识单进程redis是使用单进程模型来处理客户端的请求,对读写等事件的响应是通过linux中epoll函数的包装来做到的。Redis实际的处理速度完全依靠主进程的执行效率。Epoll是Linux内核为了处理大批量文件描述符而作了改进的epoll,是linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。数据库redis默认有16个数据库,类似pyhton列表从零开始,初始默认使用0号数据库。可在redis.conf中的database 16中定义。密码redis16个数据库都是使用同样的密码,要么都ok,要么都连接失败,设置密码在redis.conf中的requirepass foobared中设置,默认是注释掉的,即没有密码。去掉注释,密码默认就是foobared,客户端连接时使用auth foobared进行认证。端口redis默认的端口是6379,可以在redis.conf中的prot 6379更改索引redis索引是从0开始的命令select命令:用于切换数据库,比如切换到2号数据库select 2dbsize命令:用于查看当前数据库的key的数量flushdb命令:清空当前库flushall命令:清空整个 Redis 服务器的数据(删除所有数据库的所有 key )。redis数据类型键key的操作命令列举下常用的key操作命令命令说明keys pattern查找符合pattern(正则表达式)的key,比如keys 列出所有keydel key删除存在的keyexists key判断key是否存在expire key seconds给指定的key设置过期时间,以秒为单位ttl key以秒为单位,返回给定 key 的剩余生存时间(TTL, time to live)。type key返回 key 所储存的值的类型几个注意点:为key设置过期时间,当key过期后,是直接从内存中剔除,不是说只删除了value而key还存在。已存在的key,重新添加重名的key,新添加key的value会覆盖旧的valuettl key命令,返回-1表示这个key永不过期,-2代表已过期字符串stringstring类型是redis最基本的数据类型,一个key对应一个value,并且string类型是二进制安全的,它可以包含任何数据,比如图片或者序列化的对象,一个string类型的value最大能存储512M的数据。string命令介绍命令说明示例set key value设置指定key的值set k1 v1get key获取key的值get k1append key value如果key已经存在并且是一个字符串,APPEND命令将指定的value追加到该key原来值value的末尾append k1 v1strlen key返回 key 所储存的字符串值的长度strlen k1incr key将 key 中储存的数字值增一(要求value必须为数字)incr k2decr key将 key 中储存的数字值减一(要求value必须为数字)decr k2incrby key increment将 key 所储存的值加上给定的增量值incrby k2 3decrby key increment将 key 所储存的值减上给定的增量值decrby k2 3getrange key start end返回 key 中字符串值的子字符getrange k3 0 -1setrange key offset valye用 value 参数覆写给定 key 所储存的字符串值,从偏移量 offset 开始setrange k3 0 aaasetex key seconds value设置key的过期时间为secondssetex k4 10 hellosetnx key value当key不存在时才设置key的值set k5 v5mset同时设置一个或多个 key-value 对mset k6 v6 k7 v7mget获取所有(一个或多个)给定 key 的值mget k1 k2 k3msetnx同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在msetnx k8 v8 k9 v9getset将给定 key 的值设为 value ,并返回 key 的旧值(old value)getset k1 v11示例1,set/get/append/strlen127.0.0.1:6379> set k1 v1OK127.0.0.1:6379> get k1"v1"127.0.0.1:6379> append k1 v11 # 在原先k1的值v1后添加v11(integer) 5127.0.0.1:6379> get k1 “v1v11"127.0.0.1:6379> strlen k1 (integer) 5 # v1v11总共5个字符127.0.0.1:6379> 示例2,incr/decr/incrby/decrby127.0.0.1:6379> set k2 1 # 设置k2的值为1OK127.0.0.1:6379> get k2"1"127.0.0.1:6379> incr k2 # incr命令使key的值加1(integer) 2127.0.0.1:6379> get k2"2” # 1+1 = 2 127.0.0.1:6379> decr k2 # decr命令使key的值减1(integer) 1127.0.0.1:6379> get k2"1" # 变为1 127.0.0.1:6379> incrby k2 5 # incrby命令使key的值加上后面定义的数字(integer) 6127.0.0.1:6379> get k2 “6” # 1+5 = 6127.0.0.1:6379> decrby k2 5 # decrby与incrby相反(integer) 1 127.0.0.1:6379> get k2"1" # 6-5 = 1示例3,getrange/setrange127.0.0.1:6379> set k3 abc123456OK127.0.0.1:6379> get k3"abc123456"127.0.0.1:6379> getrange k3 0 3 # 返回从0开始到3的字符串"abc1"127.0.0.1:6379> getrange k3 0 -1 # 返回整个字符串"abc123456"127.0.0.1:6379> setrange k3 0 qwe # 将从0开始的字符串覆盖为qwe(integer) 9127.0.0.1:6379> get k3"qwe123456"127.0.0.1:6379> setrange k3 9 777 (integer) 12127.0.0.1:6379> get k3"qwe123456777"127.0.0.1:6379> 示例4,setex/setnx127.0.0.1:6379> setex k4 10 v4 # 设置k4的过期时间为10sOK127.0.0.1:6379> ttl k4 # 还有7s过期(integer) 7127.0.0.1:6379> get k4"v4"127.0.0.1:6379> ttl k4(integer) -2 # 已过期 127.0.0.1:6379> get k4(nil)127.0.0.1:6379> 127.0.0.1:6379> get k1"v1v11"127.0.0.1:6379> setnx k1 hello # k1已存在,这条命令不会改变k1的值(integer) 0127.0.0.1:6379> get k1"v1v11"127.0.0.1:6379> setnx k5 hello # k5不存在,因此新建并赋值(integer) 1127.0.0.1:6379> get k5"hello"127.0.0.1:6379> 示例5,mset/mget/msetnx127.0.0.1:6379> mset a1 dog a2 cat # 批量设置key-valueOK127.0.0.1:6379> mget a1 a2 # 批量获取value1) “dog"2) “cat"127.0.0.1:6379> msetnx a1 panda a3 lion # 其中a1以存在,这条命令执行不成功(integer) 0127.0.0.1:6379> mget a1 a2 a31) “dog"2) “cat"3) (nil)127.0.0.1:6379> msetnx a3 panda a4 lion # a3和a4都不存在,因此设置key-value成功(integer) 1127.0.0.1:6379> mget a1 a2 a3 a41) “dog"2) “cat"3) “panda"4) “lion"127.0.0.1:6379> 哈希hashhash类型是一个键值对的集合,可以将hash看做是string key和string value的映射表,它很适合存储对象。每一个Hash可以存储995701749 个键值对。k-v模式不变,但是value是键值对常用命令hset key field value:将哈希表 key 中的字段 field 的值设为 valuehget key field:获取存储在哈希表中指定字段的值。hmset key field value:同时将多个键值对添加到hash表key中hmget key field1 field2:获取给定字段的值hgetall key:获取在哈希表中指定 key 的所有字段和值hdel key field1 field2:删除一个或多个哈希表字段127.0.0.1:6379> hset k1 user id11 # 设置哈希表k1中user字段的值为id11(integer) 1127.0.0.1:6379> hget k1 user # 获取哈希表k1中user字段的值"id11"127.0.0.1:6379> hmset k1 age 22 name laowan passwd 123456 # 批量设置哈希表中的字段与值OK127.0.0.1:6379> hmget k1 age name passwd # 批量获取1) “22"2) “laowan"3) “123456"127.0.0.1:6379> hgetall k1 # 批量获取键值对1) “user"2) “id11"3) “age"4) “22"5) “name"6) “laowan"7) “passwd"8) “123456"127.0.0.1:6379> hdel k1 passwd # 删除哈希表中的字段passwd(integer) 1127.0.0.1:6379> hgetall k1 # 已删除1) “user"2) “id11"3) “age"4) “22"5) “name"6) “laowan"127.0.0.1:6379> hlen key:获取哈希表中字段的数量hexists key field :查看哈希表中指定的字段是否存在hkeys key:获取哈希表中所有字段hvals key:获取哈希表中所有的值hincrby key field increment:为哈希表 key 中的指定字段的整数值加上增量 increment hincrbyfloat key field increment:为哈希表 key 中的指定字段的浮点数值加上增量 increment 。hsetnx key field value:只有在字段 field 不存在时,设置哈希表字段的值。列表listRedis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。list常用命令lpush key value1 value2:将一个或多个值插入列表头部rpush key value1 value2:在列表中添加一个或多个值lrange key start end:获取列表指定范围内的值127.0.0.1:6379> lpush list1 1 2 3 4 5(integer) 5127.0.0.1:6379> lrange list1 0 -11) “5"2) “4"3) “3"4) “2"5) “1"127.0.0.1:6379> rpush list2 1 2 3 4 5(integer) 5127.0.0.1:6379> lrange list2 0 -11) “1"2) “2"3) “3"4) “4"5) “5"127.0.0.1:6379> lpop key:移出并获取列表的第一个元素rpop key:移出并获取列表的最后一个元素127.0.0.1:6379> lpop list1"5"127.0.0.1:6379> lpop list2"1"127.0.0.1:6379> lrange list1 0 -11) “4"2) “3"3) “2"4) “1"127.0.0.1:6379> lrange list2 0 -11) “2"2) “3"3) “4"4) “5"127.0.0.1:6379> rpop list1"1"127.0.0.1:6379> rpop list2"5"127.0.0.1:6379> lindex key index:按照索引下标获取元素llen key:获取列表的长度127.0.0.1:6379> lrange list1 0 -11) “4"2) “3"3) “2"127.0.0.1:6379> lindex list1 0"4"127.0.0.1:6379> lindex list1 1"3"127.0.0.1:6379> lindex list1 2"2"127.0.0.1:6379> lindex list1 3(nil)127.0.0.1:6379> llen list1(integer) 3lrem key count value:移除列表元素127.0.0.1:6379> rpush list3 1 1 1 2 2 2 3 3 3 4 5 6(integer) 12127.0.0.1:6379> lrange list3 0 -1 1) “1” 2) “1” 3) “1” 4) “2” 5) “2” 6) “2” 7) “3” 8) “3” 9) “3"10) “4"11) “5"12) “6"127.0.0.1:6379> lrem list3 2 3 # 删除列表中2个3(integer) 2127.0.0.1:6379> lrange list3 0 -1 1) “1” 2) “1” 3) “1” 4) “2” 5) “2” 6) “2” 7) “3” # 原先列表有3个3,删除了2个 8) “4” 9) “5"10) “6"127.0.0.1:6379>ltrim key start end:截取列表指定范围的值后再赋值给列表127.0.0.1:6379> lpush list4 1 2 3 4 5 6(integer) 6127.0.0.1:6379> lrange list4 0 -11) “6"2) “5"3) “4"4) “3"5) “2"6) “1"127.0.0.1:6379> ltrim list4 2 4 # 截取索引为2到4范围内的值(也就是4,3,2),再赋值给list4OK127.0.0.1:6379> lrange list4 0 -1 # 所以list4的值为4,3,21) “4"2) “3"3) “2"127.0.0.1:6379> linsert key BEFORE|AFTER pivot value :在列表的元素前或者元素后插入元素127.0.0.1:6379> lrange list4 0 -11) “4"2) “3"3) “2"127.0.0.1:6379> LINSERT list4 after 3 redis # 在列表的元素3后面插入元素redis(integer) 4127.0.0.1:6379> lrange list4 0 -11) “4"2) “3"3) “redis"4) “2"127.0.0.1:6379> LINSERT list4 before 3 mongodb # 在列表元素3前面插入元素mongodb(integer) 5127.0.0.1:6379> lrange list4 0 -11) “4"2) “mongodb"3) “3"4) “redis"5) “2"127.0.0.1:6379> 关于list的小总结:它是一个字符串链表,左右都可以插入添加如果键不存在,则创建新的链表如果键存在,就新增元素如果值全部移除,对应的键也就消失链表的操作无论是头部还是尾部效率都极高,但是对中间元素操作,效率就比较低。集合setRedis的Set是string类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。set常用命令sadd key m1 m2:向集合添加一个或多个成员smembers key:返回集合中所有的成员sismenber key member:判断 member 元素是否是集合 key 的成员scard key:获取集合里面元素的数量srem key value:删除集合中的元素127.0.0.1:6379> sadd set01 a a b b c c # 因为不能出现重复数据,因此只有三个(integer) 3127.0.0.1:6379> smembers set01 # 顺序也不是abc,因为是无序的1) “a"2) “c"3) “b"127.0.0.1:6379> SISMEMBER set01 a # a元素存在集合set01里(integer) 1127.0.0.1:6379> SISMEMBER set01 d # d元素不存在set01里(integer) 0127.0.0.1:6379> scard set01 # 获取集合set01的数量为3个(integer) 3127.0.0.1:6379> SREM set01 a # 删除集合set01中的元素a(integer) 1127.0.0.1:6379> SMEMBERS set01 # a元素没了1) “c"2) “b"srandmember key number:返回集合中number个随机数127.0.0.1:6379> sadd set02 a b c d e f g # 集合中有7个元素(integer) 7127.0.0.1:6379> SRANDMEMBER set02 3 # 随机出3个元素1) “g"2) “d"3) “b"127.0.0.1:6379> SRANDMEMBER set02 31) “a"2) “c"3) “f"127.0.0.1:6379> SRANDMEMBER set02 31) “c"2) “b"3) “f"127.0.0.1:6379> smove source destination member :将 member 元素从 source 集合移动到 destination 集合127.0.0.1:6379> sadd key3 ‘hello’ ‘world’ ‘foo’(integer) 3127.0.0.1:6379> sadd key4 ‘bar’(integer) 1127.0.0.1:6379> SMOVE key3 key4 ‘foo’ (integer) 1127.0.0.1:6379> SMEMBERS key31) “world"2) “hello"127.0.0.1:6379> SMEMBERS key41) “foo"2) “bar"127.0.0.1:6379> sdiff key1 key2:差集,返回给定集合之间的差集。不存在的集合 key 将视为空集。sinter key1 key2:交集, 不存在的集合 key 被视为空集。当给定集合当中有一个空集时,结果也为空集sunion key1 key2:并集,不存在的集合 key 被视为空集127.0.0.1:6379> sadd key1 a b c (integer) 3127.0.0.1:6379> sadd key2 a d c(integer) 3127.0.0.1:6379> SDIFF key1 key2 1) “b"127.0.0.1:6379> SDIFF key2 key11) “d"127.0.0.1:6379> SINTER key1 key21) “a"2) “c"127.0.0.1:6379> SUNION key1 key21) “a"2) “d"3) “b"4) “c"有序集合zsetRedis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。zset的成员是唯一的,但分数(score)却可以重复。在set的基础上,加了一个score值,set是k1 v1 k2 v2,zset是k1 score1 v1 k2 score2 v2.常用命令zadd key score1 member1 [score2 member2]:向有序集合添加一个或多个成员,或者更新已存在成员的分数zrange key start stop [WITHSCORES] :通过索引区间返回有序集合成指定区间内的成员127.0.0.1:6379> zadd k1 60 v1 70 v2 80 v3 90 v4 100 v5 # 创建有序集合k1和多个成员(integer) 5127.0.0.1:6379> zrange k1 0 -1 # 显示成员1) “v1"2) “v2"3) “v3"4) “v4"5) “v5"127.0.0.1:6379> zrange k1 0 -1 withscores # 显示分数与成员 1) “v1” 2) “60” 3) “v2” 4) “70” 5) “v3” 6) “80” 7) “v4” 8) “90” 9) “v5"10) “100"127.0.0.1:6379> zrangebyscore key min max [WITHSCORES] [LIMIT] :通过分数返回有序集合指定区间内的成员参数withscore:显示分数(指不包含limit:从索引值开始选取几个,比如limit 2 2指从下标为2的值开始选取2个值127.0.0.1:6379> ZRANGEBYSCORE k1 60 901) “v1"2) “v2"3) “v3"4) “v4"127.0.0.1:6379> ZRANGEBYSCORE k1 60 (90 # 分数相当于选取60<=x<90中的x值1) “v1"2) “v2"3) “v3"127.0.0.1:6379> ZRANGEBYSCORE k1 (60 (90 # 分数大于60,小于90之间的值1) “v2"2) “v3"127.0.0.1:6379> ZRANGEBYSCORE k1 (60 901) “v2"2) “v3"3) “v4"127.0.0.1:6379> ZRANGEBYSCORE k1 60 90 limit 2 21) “v3"2) “v4"ZREM key member [member …] :移除有序集合中的一个或多个成员127.0.0.1:6379> zrem k1 v5 # 删除有序集合k1中的值v5(integer) 1127.0.0.1:6379> zrange k1 0 -1 withscores1) “v1"2) “60"3) “v2"4) “70"5) “v3"6) “80"7) “v4"8) “90"127.0.0.1:6379> zcard key:获取有序集合的成员数zcount key min max:计算在有序集合中指定区间分数的成员数zrank key member:返回有序集合中指定成员的索引zscore key member:返回有序集中,成员的分数值127.0.0.1:6379> zrange k1 0 -1 withscores1) “v1"2) “60"3) “v2"4) “70"5) “v3"6) “80"7) “v4"8) “90"127.0.0.1:6379> ZCARD k1 # 有序集合k1中,有四个成员(integer) 4127.0.0.1:6379> zcount k1 60 80 # 成员在60分到80分之间的有三个值(包含60和80)(integer) 3127.0.0.1:6379> zcount k1 60 70 # 成员在60到70之间的有2个(integer) 2127.0.0.1:6379> zrank k1 v4 # 成员v4在有序集合中索引值为3(integer) 3127.0.0.1:6379> zscore k1 v4 # 成员v4在有序集合中的分数是90"90"127.0.0.1:6379> 命令很多,多多练习,不必死记硬背。redis.conf配置文件解析redis.conf的路径通常在安装目录下。不过linux中通常不会直接修改本身的配置文件,而是拷贝一份进行配置。reids中常用的配置是否后台运行,默认为nodaemonize yes设置tcp的backlog,非高并发环境默认即可。tcp-backlog 511backlog是一个连接队列,队列总和=未完成三次握手队列+已完成三次握手队列。高并发环境下需要一个高的backlog值来避免客户端连接过慢的问题。注意Linux内核会将这个值减小到/proc/sys/net/core/somaxconn的值,所以需要确认增大somaxconn和tcp_max_syn_backlog这两个值。默认端口port 6379指定IP监听bind 127.0.0.1 ip2 ip3 ip4定义redis进程PID文件pidfile /var/run/redis_6379.pid设置redis日志级别loglevel noticeRedis默认有四种日志级别 debug (a lot of information, useful for development/testing)# 开发测试阶段使用 verbose (many rarely useful info, but not a mess like the debug level)# notice (moderately verbose, what you want in production probably) warning (only very important / critical messages are logged) #生产中使用日志文件位置logfile /var/log/redis.logredis数据库数量,默认16个,redis-cli中使用select切换数据库databases 16设置密码,默认是注释的即没密码,设置密码打开注释,修改foobared即可redis-cli中使用auth password进行认证requirepass foobared禁止protected-modeprotected-mode yes/no (保护模式,是否只允许本地访问)AOF日志开关是否打开appendonly no/yes指定AOF日志的文件名appendfilename appendonly.aof指定更新日志的条件,有3个可选值no:表示等操作系统进行数据缓存同步到磁盘(快)always:表示每次更新操作后调用fsync()将数据写到磁盘(慢,安全)everysec:表示每秒同步一次(默认值)指定Redis最大内存限制,Redis在启动时会把数据加载到内存中,达到最大内存后,Redis会尝试清除已到期或者即将到期的key。当此方法处理后,仍然达到最大内存设置,将无法进行写入操作,但可以进行读取操作。Redis新的vm机制,会将key存放内存,value存放swap区。maxmemory <bytes>当客户端闲置多长时间后关闭连接,如果指定为0,表示关闭改功能timeout 300RDB持久化策略RDB持久化是指在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是SNAPSHOT快照,它恢复时是将快照文件直接读取到内存里。优点Redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上一次持久化好的文件。整个过程中,主进程不进行任何IO操作,确保了极高的性能。如果需要进行大规模数据的恢复,且对于数据恢复的完整性不那么敏感,那么RDB比AOF会高效许多。缺点最后一次持久化的数据可能丢失。每次保存 RDB 的时候,Redis 都要 fork() 出一个子进程,并由子进程来进行实际的持久化工作。 在数据集比较庞大时, fork() 可能会非常耗时,造成服务器在某某毫秒内停止处理客户端;如果数据集非常巨大,并且 CPU 时间非常紧张的话,那么这种停止时间甚至可能会长达整整一秒。 虽然 AOF 重写也需要进行 fork() ,但无论 AOF 重写的执行间隔有多长,数据的耐久性都不会有任何损失。RDB持久化配置修改redis.conf配置文件save 900 1 save 300 10save 60 10000stop-writes-on-bgsave-error yesrdbcompression yes rdbchecksum yesdbfilename dump.rdbdir /data/redis/对应的含义是:900秒内有1次更改300秒内有10次更改60秒内有10000次更改就将内存中的数据写入到dump.rdb文件中。后台备份进程出错时,主进程停不停止写入? 主进程不停止容易造成数据不一致导出的rdb文件是否压缩 如果rdb的大小很大的话建议这么做导入rbd恢复时数据时,要不要检验rdb的完整性 验证版本是不是一致导出来的rdb文件名rdb的放置路径如果不设置RDB持久化只需要更改为save ““即可。注意:在redis-cli中执行flushall会立刻刷新dump.rdb文件。如何恢复之前的数据假如已经保存了一个dump.rdb文件,但是redis-cli中执行了一次flushall命令,此时内存中已经没有任何数据了,但是又想恢复到原来的数据,应该怎么做?做个小测试:先修改redis.conf配置文件save 30 5 # 即30秒内有5次更改就将内存的数据写入dump.rdb然后redis-cli里在30s内写入5个数据。127.0.0.1:6379> set k1 v1OK127.0.0.1:6379> set k2 v2OK127.0.0.1:6379> set k3 v3OK127.0.0.1:6379> set k4 v4OK127.0.0.1:6379> set k5 v5OK退出后可以看到新生成的dump.rdb文件[root@moli_linux1 redis]# ll总用量 4-rw-r–r– 1 root root 133 3月 27 14:52 dump.rdb # 注意此处的时间[root@moli_linux1 redis]# cp dump.rdb dump.rdb.bak # 将这个文件备份生产中应该讲备份文件放置在其他机器,测试所用就放在本地上了。再次进入redis-cli执行flushall命令127.0.0.1:6379> flushallOK127.0.0.1:6379> exit[root@moli_linux1 redis]# ll dump.rdb-rw-r–r– 1 root root 93 3月 27 14:56 dump.rdb # 立刻新生成的dump.rdb文件此时重启redis服务,之前的持久化数据不会保存,因为重启加载的文件还是flushall后的dump.rdb文件。要想恢复之前的数据只要把保存的dump.rdb文件重新加载进去即可。[root@moli_linux1 redis]# rm -f dump.rdb # 删除flushall保存的dump.rdb[root@moli_linux1 redis]# mv dump.rdb.bak dump.rdb # 把备份的文件更改为redis启动时读取的文件[root@moli_linux1 redis]# redis-server /etc/redis.conf 9377:C 27 Mar 15:07:11.066 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo9377:C 27 Mar 15:07:11.066 # Redis version=4.0.10, bits=64, commit=00000000, modified=0, pid=9377, just started9377:C 27 Mar 15:07:11.066 # Configuration loaded[root@moli_linux1 redis]# redis-cli 127.0.0.1:6379> keys * # 数据恢复1) “k5"2) “k3"3) “k2"4) “k1"5) “k4"备份创建一个定期任务(cron job), 每小时将一个 RDB 文件备份到一个文件夹, 并且每天将一个 RDB 文件备份到另一个文件夹。确保快照的备份都带有相应的日期和时间信息,每次执行定期任务脚本时,使用 find 命令来删除过期的快照。至少每天一次,将 RDB 备份到你的数据中心之外,或者至少是备份到你运行 Redis服务器的物理机器之外。AOF持久化策略AOF以日志的形式来记录每个写操作,将Redis执行过的所有写命令记录下来(读操作不记录),只许追加文件但不可以改写文件,redis启动时会读取该文件重新构建数据,会将文件中的命令重新执行一遍以完成数据恢复。AOF保存的是appendonly.aof文件。AOF配置appendonly noappendfilename “appendonly.aof"appendfsync alwaysappendfsync everysecappendfsync nono-appendfsync-on-rewrite yes/noauto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb对于配置分别表示是否开启aof日志功能aof文件名同步持久化,每次发生数据变更就会被立刻记录到磁盘,性能较差但数据完整性出厂默认配置,异步操作,每秒记录,如果一秒内宕机,有数据丢失写入工作交给操作系统,由操作系统判断缓冲区大小,统一写入到aof.重写时是否可以运用Appendfsync,用默认no即可,保证数据安全性aof文件大小比起上次重写时的大小,增长率100%(新=2旧)时重写,缺点:业务开始的时候,会重复重写多次。aof文件,至少超过64M时,重写关于AOF的重写rewriteAOF采用文件追加的方式,文件会越来越大,为避免出现这种情况,新增了重写机制,当AOF文件的大小超过所定的阈值,redis就会启动AOF文件内容压缩,只保留可以恢复数据的最小指令集,可以使用命令bgrewriteaofAOF的重写原理(减肥计划):AOF文件持续增大而过大,会fork出一条新进程来将文件重写(先写临时文件最后再rename),遍历新进程中的内存数据,每条记录有一条set语句。重写aof文件的操作,并没有读取旧的aof文件。而是将整个内存中的数据库内容用命令的方式重写一个新的aof文件。AOF的触发机制:reids会记录上次重写aof文件的大小,默认配置是当aof文件大小是上次rewrite后大小的一倍且文件大小大于64M时触发。AOF优点使用AOF 会让你的Redis更加耐久: 你可以使用不同的fsync策略:无fsync,每秒fsync,每次写的时候fsync.使用默认的每秒fsync策略,Redis的性能依然很好(fsync是由后台线程进行处理的,主线程会尽力处理客户端请求),一旦出现故障,你最多丢失1秒的数据.Redis 可以在 AOF 文件体积变得过大时,自动地在后台对 AOF 进行重写: 重写后的新 AOF 文件包含了恢复当前数据集所需的最小命令集合。 整个重写操作是绝对安全的,因为 Redis 在创建新 AOF 文件的过程中,会继续将命令追加到现有的 AOF 文件里面,即使重写过程中发生停机,现有的 AOF 文件也不会丢失。一旦新 AOF 文件创建完毕,Redis 就会从旧 AOF 文件切换到新 AOF 文件,并开始对新 AOF 文件进行追加操作。AOF 文件有序地保存了对数据库执行的所有写入操作, 这些写入操作以 Redis 协议的格式保存, 因此 AOF 文件的内容非常容易被人读懂, 对文件进行分析(parse)也很轻松。 导出(export) AOF 文件也非常简单: 举个例子, 如果你不小心执行了 FLUSHALL 命令, 但只要 AOF 文件未被重写, 那么只要停止服务器, 移除 AOF 文件末尾的 FLUSHALL 命令, 并重启 Redis , 就可以将数据集恢复到 FLUSHALL 执行之前的状态。AOF缺点对于相同数据集的数据而言,AOF文件要远大于RDB文件,恢复速度慢与RDBAOF运行效率要慢于RDB,每秒同步策略较好,不同步效率和RDB相同。如果AOF文件损坏了怎么办?生产环境下,如果因为断电而导致AOF写入的数据不完整, 导致AOF文件出错,那么当redis重启的时候就会拒绝载入这个AOF文件,保证数据的一致性。如果发生这种情况可以使用redis自带的redis-check-aof进行修复。为损坏的AOF文件进行备份使用redis-check-aof -fix appendonly.aof命令进行修复重启redis服务器,等待载入aof文件,完成数据恢复dump.rdb和appendonly.aof文件能否共存?先看下配置文件的注释AOF and RDB persistence can be enabled at the same time without problems. If the AOF is enabled on startup Redis will load the AOF, that is the file with the better durability guarantees.翻译过来大概是:RDB和AOF持久化策略可以同时开启,如果AOF和RDB都开启,那么redis服务器每次重启时都会优先使用AOF文件恢复数据集。如何选择RDB还是AOFredis事务,主从,消息订阅,事务,慢日志后续再做笔记。秃头才能变强,加油!参考资料惨绿少年@clsn.io:Redis数据库菜鸟教程:Redis教程Redis 官网:https://redis.io/ ...

March 28, 2019 · 8 min · jiezi

Linux:netstat 面试答疑

前言在面试的过程中,总不可避免会问到与 操作系统 和 网络 相关的内容,因为这个确实是工作上经常打交道的内容;敢打包票,十个计算机网络的面试题,必有几道和 tcp/udp 有关,像什么 tcp三次握手四次挥手、udp 与 tcp 区别等等。除了这些知识点,还有一个很常见的,那就是 netstat 了。为什么会问 netstat? 因为有太多的情况是需要它来协助了,比如网络链接异常,所以我一般会从 netstat 开始,由浅入深来考察对方的命令基础和网络基础:问题1. 如何查看哪个程序正在监听 xxxx 端口?如何查看哪个程序正在监听 xxxx 端口?我期望的答案:netstat -antlp | grep xxxx考点:除了写出命令,还要解释上面的选项,如 -a、-n、-t、-l、-p 分别是代表什么意思?有些童鞋可能不理解,为什么记一个命令还需要记选项含义?其实这个问题是见仁见智的,我个人认为记住常用的选项首先能够加快使用命令的效率,其次,当你敲完一段命令,你可以在意识中就能明白预期会有什么结果,就好像每人都看过关于删库的段子: rm -rf。这个命令组合固然可怕,但是我们却不得不去使用,那么如何使用能将危险锁在笼子里才是我们应该去考虑的问题,想解决这个问题,很显然我们就得先去明白 -r 和 -f 是什么含义,看了 man 文档:OPTIONS Remove (unlink) the FILE(s). -f, –force ignore nonexistent files and arguments, never prompt -r, -R, –recursive remove directories and their contents recursively组合起来的意思就是:敲入 rm -rf,系统就会开始递归地强制的删除东西,等我们反应过来,就是删得七七八八了。我们可以不用把所有选项全部背下来,但是起码自己写出的命令、选项是什么含义得知道。世上是木有后悔药的,所以在每执行一个命令,都应该对自己负责。问题2. 如何查看当前机器各网络状态的链接个数?回归主题,上面那道是比较简单的题目,我们接下来要问2. 如何查看当前机器各网络状态的链接个数?为了避免死记硬背格式,我直接贴出 netstat -ant 的输出# netstat -antActive Internet connections (servers and established)Proto Recv-Q Send-Q Local Address Foreign Address Statetcp 0 0 127.0.0.1:25 0.0.0.0:* LISTENtcp 0 0 0.0.0.0:32200 0.0.0.0:* LISTENtcp 0 0 0.0.0.0:27017 0.0.0.0:* LISTENtcp 0 0 0.0.0.0:80 0.0.0.0:* LISTENtcp 1 0 110.82.143.62:50430 110.82.143.62:80 CLOSE_WAITtcp 0 0 110.130.165.132:45937 110.200.115.132:27017 ESTABLISHEDtcp 0 0 110.130.165.132:58529 110.200.115.132:27017 ESTABLISHEDtcp 0 0 110.130.165.132:45932 110.200.115.132:27017 ESTABLISHEDtcp 0 0 110.120.165.132:45513 110.90.36.54:27017 ESTABLISHEDtcp 1 0 110.82.23.62:44746 110.82.43.62:80 CLOSE_WAITtcp 1 0 110.82.23.62:39068 110.82.43.62:80 CLOSE_WAIT我期望的答案:netstat -ant | awk ‘NR>2{state[$NF]++}END{for(i in state) print i, state[i]}‘考点:netstat 和 awk 的搭配使用(awk 写法没强制规定,只要能出结果就好,但是肯定命令越少越优)问题3. netstat 输出 tcp 和 udp 链接信息的工作原理是什么?如果这两题目都回答过来了,那就代表基础尚可了,我准备问更加深入的了:3. netstat 输出 tcp 和 udp 链接信息的工作原理是什么?我期望的答案:是解析 /proc/net/tcp、 /proc/net/udp 的结果考点:单纯问问知识面接着上面继续提问:问题4. netstat 可以找出每个链接对应的哪个程序,是怎么实现的?4. netstat 可以找出每个链接对应的哪个程序,是怎么实现的?这道题已经是比较接近核心了,所以这道题如果能回答上,那肯定就是有真的深入了解过 netstat,可能有自我驱动、自我学习的能力,潜质是挺好的。简要分析:在 linux 系统上,任何东西都可以看成是一个文件,对于 socket 也是如此。我们可以在每个程序的 fd 目录,也就是 /proc/{pid}/fd 下可以看到每个进程打开的文件:ls -l /proc/22134/fdtotal 0lr-x—— 1 root root 64 Mar 13 16:20 0 -> pipe:[667139080]l-wx—— 1 root root 64 Mar 13 16:20 1 -> pipe:[667139081]l-wx—— 1 root root 64 Mar 13 16:20 10 -> pipe:[669473083]lrwx—— 1 root root 64 Mar 13 16:20 11 -> socket:[669471737]lrwx—— 1 root root 64 Mar 13 16:20 12 -> socket:[669468288] 其中 socket:[669468288] 就代表这个进程的其中一个网络链接,而中括号里面的 669468288 就是该 socket 的 inode 编号。我们可以根据这个 inode 编号,在刚才提到的 /proc/net/tcp 和 /proc/net/udp 文件里面去查找:# grep 669468288 /proc/net/tcp 8: 0100007F:0004 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 669468288 1 ffff8806545e9100 100 0 0 10 0# grep 669468288 /proc/net/udp 无结果结合第三题的问题和上面的分析,这道题我期望的答案:1. netstat 解析/proc/net/tcp、 /proc/net/udp;2. 遍历 /proc/{pid}/fd 下的每个文件拿到每个 socket 的 inode;3. 1 和 2 相互关联得出来的总结面试是个既考验广度也考验深度的过程,我们可以不了解高深的知识,但是我们不能停止探索专业的脚步。 ...

March 16, 2019 · 2 min · jiezi

Nginx访问控制与参数调优

Nginx全局变量Nginx中有很多的全局变量,可以通过$变量名来使用。下面列举一些常用的全局变量:变量说明$args请求中的参数,如www.123.com/1.php?a=1&b=2的$args就是a=1&b=2$content_lengthHTTP请求信息里的”Content-Length”$conten_typeHTTP请求信息里的”Content-Type”$document_rootnginx虚拟主机配置文件中的root参数对应的值$document_uri当前请求中不包含指令的URI,如www.123.com/1.php?a=1&b=2的$document_uri就是1.php,不包含后面的参数$host主机头,也就是域名$http_user_agent客户端的详细信息,也就是浏览器的标识,用curl -A可以指定$http_cookie客户端的cookie信息$limit_rate如果nginx服务器使用limit_rate配置了显示网络速率,则会显示,如果没有设置, 则显示0$remote_addr客户端的公网ip$remote_port客户端的port$remote_user如果nginx有配置认证,该变量代表客户端认证的用户名$request_body_file做反向代理时发给后端服务器的本地资源的名称$request_method请求资源的方式,GET/PUT/DELETE等$request_filename当前请求的资源文件的路径名称,相当于是$document_root/$document_uri的组合$request_uri请求的链接,包括$document_uri和$args$scheme请求的协议,如ftp,http,https$server_protocol客户端请求资源使用的协议的版本,如HTTP/1.0,HTTP/1.1,HTTP/2.0等$server_addr服务器IP地址$server_name服务器的主机名$server_port服务器的端口号$uri和$document_uri相同$http_referer客户端请求时的referer,通俗讲就是该请求是通过哪个链接跳过来的,用curl -e可以指定Nginx locationlocation作用location指令的作用是根据用户请求的URI来执行不同的应用。即根据用户请求的网站地址URL进行匹配,匹配成功就进行相应的操作。语法location的语法规则:location [=|||^] /uri/ { … }location匹配的变量是$uri关于几种字符的说明字符描述=表示精准匹配表示区分大小写的正则匹配~表示不区分大小写的正则匹配^表示uri以指定字符或字符串开头/通用匹配,任何请求都会匹配到规则优先级= 高于 ^ 高于 ~ 等于 ~ 高于 /示例1location = “/12.jpg” { … }如:www.syushin.com/12.jpg 匹配www.syushin.com/abc/12.jpg 不匹配location ^~ “/abc/” { … }如:www.syushin.com/abc/123.html 匹配www.syushin.com/a/abc/123.jpg 不匹配location ~ “png” { … }如:www.syushin.com/aaa/bbb/ccc/123.png 匹配www.syushin.com/aaa/png/123.html 匹配location ~ “png” { … }如:www.syushin.com/aaa/bbb/ccc/123.PNG 匹配www.syushin.com/aaa/png/123.html 匹配location /admin/ { … }如:www.syushin.com/admin/aaa/1.php 匹配www.syushin.com/123/admin/1.php 不匹配注意:有些资料上介绍location支持不匹配 !如: location ! ‘png’{ … }这是错误的,location不支持 !如果有这样的需求,可以通过if(location优先级小于if )来实现,如: if ($uri ! ‘png’) { … }访问控制web2.0时代,很多网站都是以用户为中心,网站允许用户发布内容到服务器。由于为用户开放了上传功能,因此有很大的安全风险,比如黑客上传木马程序等等。因此,访问控制就很有必要配置了。deny与allow字面上很容易理解就是拒绝和允许。Nginx的deny和allow指令是由ngx_http_access_module模块提供,Nginx安装默认内置了该模块。语法语法:allow/deny address | CIDR | unix: | all它表示,允许/拒绝某个ip或者一个ip段访问.如果指定unix:,那将允许socket的访问。注意:unix在1.5.1中新加入的功能。在nginx中,allow和deny的规则是按顺序执行的。 示例1:location /{ allow 192.168.0.0/24; allow 127.0.0.1; deny all;}说明:这段配置值允许192.168.0.0/24网段和127.0.0.1的请求,其他来源IP全部拒绝。示例2:location ~ “admin”{ allow 192.168.30.7; deny all}说明:访问的uri中包含admin的请求,只允许192.168.30.7这个IP的请求。基于location的访问控制日常上,访问控制基本是配合location来做配置的,直接例子吧。示例1:location /blog/{ deny all;}说明:针对/blog/目录,全部禁止访问,这里的deny all;可以改为return 403;.示例2location ~ “.bak|.ht”{ return 403;}说明:访问的uri中包含.bak字样的或者包含.ht的直接返回403状态码。测试链接举例:www.syushin.com/abc.bakwww.syushin.com/blog/123/.htalskdjf如果用户输入的URL是上面其中之一都会返回403。示例3location ~ (data|cache|tmp|image|attachment)..php${ deny all;}说明:请求的uri中包含data、cache、tmp、image、attachment并且以.php结尾的,全部禁止访问。测试链接举例:www.xxxxxx.com/aming/cache/1.phpwww.xxxxxxx.com/image/123.phpswww.xxxxxx.com/aming/datas/1.php基于$document_uri的访问控制前面介绍了内置变量$document_uri含义是当前请求中不包含指令的URI。如www.123.com/1.php?a=1&b=2的$document_uri就是1.php,不包含后面的参数。我们可以针对这个变量做访问控制。示例1if ($document_uri ~ “/admin/”){ return 403;}说明:当请求的uri中包含/admin/时,直接返回403.注意:if结构中不支持使用allow和deny。测试链接:1. www.xxxxx.com/123/admin/1.html 匹配2. www.xxxxx.com/admin123/1.html 不匹配3. www.xxxxx.com/admin.php 不匹配示例2if ($document_uri = /admin.php){ return 403;}说明:请求的uri为/admin.php时返回403状态码。测试链接:1. www.xxxxx.com/admin.php # 匹配2. www.xxxxx.com/123/admin.php # 不匹配示例3if ($document_uri ~ ‘/data/|/cache/..php$’){ return 403;}说明:请求的uri包含data或者cache目录,并且是php时,返回403状态码。测试链接:1. www.xxxxx.com/data/123.php # 匹配2. www.xxxxx.com/cache1/123.php # 不匹配基于$request_uri访问控制$request_uri比$docuemnt_uri多了请求的参数。主要是针对请求的uri中的参数进行控制。示例if ($request_uri ~ “gid=\d{9,12}”){ return 403;}说明:\d{9,12}是正则表达式,表示9到12个数字,例如gid=1234567890就符号要求。测试链接:1. www.xxxxx.com/index.php?gid=1234567890&pid=111 匹配2. www.xxxxx.com/gid=123 不匹配背景知识:曾经有一个客户的网站cc攻击,对方发起太多类似这样的请求:/read-123405150-1-1.html实际上,这样的请求并不是正常的请求,网站会抛出一个页面,提示帖子不存在。所以,可以直接针对这样的请求,return 403状态码。基于$http_user_agent的访问控制(反爬虫)user_agent可以简单理解成浏览器标识,包括一些蜘蛛爬虫都可以通过user_agent来辨识。假如观察访问日志,发现一些搜索引擎的蜘蛛对网站访问特别频繁,它们并不友好。为了减少服务器的压力,其实可以把除主流搜索引擎蜘蛛外的其他蜘蛛爬虫全部封掉。示例if ($user_agent ~ ‘YisouSpider|MJ12bot/v1.4.2|YoudaoBot|Tomato’){ return 403;}说明:user_agent包含以上关键词的请求,全部返回403状态码。测试:1. curl -A “123YisouSpider1.0"2. curl -A “MJ12bot/v1.4.1"基于$http_referer的访问控制$http_referer除了可以实现防盗链的功能外,还可以做一些特殊的需求。比如:网站被黑挂马,搜索引擎收录的网页是有问题的,当通过搜索引擎点击到网站时,却显示一个博彩网站。由于查找木马需要时间,不能马上解决,为了不影响用户体验,可以针对此类请求做一个特殊操作。比如,可以把从百度访问的链接直接返回404状态码,或者返回一段html代码。示例if ($http_referer ~ ‘baidu.com’){ return 404;}或者if ($http_referer ~ ‘baidu.com’){ return 200 “<html><script>window.location.href=’//$host$request_uri’;</script></html>”;}Nginx参数优化Nginx作为高性能web服务器,即使不特意调整配置参数也可以处理大量的并发请求。当然,配置调优会使Nginx性能更加强悍,配置参数需要结合服务器硬件性能等做参考。worker进程优化worker_processes num;该参数表示启动几个工作进程,建议和本机CPU核数保持一致,每一核CPU处理一个进程,num表示数字。worker_rlimit_nofile它表示Nginx最大可用的文件描述符个数,需要配合系统的最大描述符,建议设置为102400。还需要在系统里执行ulimit -n 102400才可以。也可以直接修改配置文件/etc/security/limits.conf修改增加:#* soft nofile 655350 (去掉前面的#)#* hard nofile 655350 (去掉前面的#)worker_connections该参数用来配置每个Nginx worker进程最大处理的连接数,这个参数也决定了该Nginx服务器最多能处理多少客户端请求(worker_processes * worker_connections)建议把该参数设置为10240,不建议太大。http/tcp连接数优化use epoll使用epoll模式的事件驱动模型,该模型为Linux系统下最优方式。multi_accept on使每个worker进程可以同时处理多个客户端请求。sendfile on使用内核的FD文件传输功能,可以减少user mode和kernel mode的切换,从而提升服务器性能。tcp_nopush on当tcp_nopush设置为on时,会调用tcp_cork方法进行数据传输。使用该方法会产生这样的效果:当应用程序产生数据时,内核不会立马封装包,而是当数据量积累到一定量时才会封装,然后传输。tcp_nodelay on不缓存data-sends(关闭 Nagle 算法),这个能够提高高频发送小数据报文的实时性。(关于Nagle算法)【假如需要频繁的发送一些小包数据,比如说1个字节,以IPv4为例的话,则每个包都要附带40字节的头,也就是说,总计41个字节的数据里,其中只有1个字节是我们需要的数据。为了解决这个问题,出现了Nagle算法。它规定:如果包的大小满足MSS,那么可以立即发送,否则数据会被放到缓冲区,等到已经发送的包被确认了之后才能继续发送。通过这样的规定,可以降低网络里小包的数量,从而提升网络性能。keepalive_timeout定义长连接的超时时间,建议30s,太短或者太长都不一定合适,当然,最好是根据业务自身的情况来动态地调整该参数。keepalive_requests定义当客户端和服务端处于长连接的情况下,每个客户端最多可以请求多少次,可以设置很大,比如50000.reset_timeout_connection on设置为on的话,当客户端不再向服务端发送请求时,允许服务端关闭该连接。client_body_timeout客户端如果在该指定时间内没有加载完body数据,则断开连接,单位是秒,默认60,可以设置为10。send_timeout这个超时时间是发送响应的超时时间,即Nginx服务器向客户端发送了数据包,但客户端一直没有去接收这个数据包。如果某个连接超过send_timeout定义的超时时间,那么Nginx将会关闭这个连接。单位是秒,可以设置为3。压缩对于纯文本的内容,Nginx是可以使用gzip压缩的。使用压缩技术可以减少对带宽的消耗。由ngx_http_gzip_module模块支持配置如下:gzip on; //开启gzip功能gzip_min_length 1024; //设置请求资源超过该数值才进行压缩,单位字节gzip_buffers 16 8k; //设置压缩使用的buffer大小,第一个数字为数量,第二个为每个buffer的大小gzip_comp_level 6; //设置压缩级别,范围1-9,9压缩级别最高,也最耗费CPU资源gzip_types text/plain application/x-javascript text/css application/xml image/jpeg image/gif image/png; //指定哪些类型的文件需要压缩gzip_disable “MSIE 6.”; //IE6浏览器不启用压缩测试:curl -I -H “Accept-Encoding: gzip, deflate” http://www.xxxxx.com/1.css日志错误日志级别调高,比如crit级别,尽量少记录无关紧要的日志。对于访问日志,如果不要求记录日志,可以关闭,静态资源的访问日志关闭静态文件过期对于静态文件,需要设置一个过期时间,这样可以让这些资源缓存到客户端浏览器,在缓存未失效前,客户端不再向服务期请求相同的资源,从而节省带宽和资源消耗。配置示例如下:location ~* ^.+.(gif|jpg|png|css|js)$ { expires 1d; //1d表示1天,也可以用24h表示一天。}访问控制和参数调优只记录其中一些部分,有些可能会在工作中用到,SSL的配置后续再作笔记吧,春招笔试好难呀,努力学习吧… ...

March 14, 2019 · 2 min · jiezi

linux运维之路之nginx

软件介绍与 Apache软件类似, Nginx ( “engme x")是一个开源的,支持高性能、高并发的 WWW服务器和代理服务软件。它是由俄罗斯人 Igor Sysoev开发的,最初被应用在勘罗斯的大型网站 www.rambler.ru 上,后来作者将源代码以类BSD许可证的形式开源出来供全球使用。Nginx因具有高并发(特别是静态资源)、占用系统资源少等特性,且功能丰富而逐渐流行起来。在功能应用发面,Nginx不但是一个优秀的Web服务软件,还具有反向代理负载均衡功能和缓存服务功能。在反向代理负载均衡功能方面,它类似于大名鼎鼎的LVS负载均衡及Haproxy等专业代理软件,但是Nginx部署起来更为简单、方便;在缓存服务功能方面,它又类似于Squid等专业的缓存服务软件。Nginx 的官方介绍见 http://nginx.org/ennginx软件特性HTTP服务器的特色及优点:支持高并发:能支持几万并发连接(特别是静态小文件业务环境)资源消耗少:在3万并发连接下,开启10个Nginx线程消耗的内存不到200MB可以做HTTP反向代理及加速缓存、即负载均衡功能,内置对RS节点服务器健康检查功能这相当于专业的Haproxy软件或LVS的功能。具备Squid等专业缓存软件等的缓存功能。支持异步网络I/O事件横型epoll(Linux2.6+)nginx的安装nginx的安装可参考上一篇博文,这里不再啰嗦了。介绍几个nginx管理的命令吧。启动 $ /usr/local/nginx/sbin/nginx 重新加载 $ /usr/local/nginx/sbin/nginx -s reload检查语法$ /usr/local/nginx/sbin/nginx -t 杀死进程 $ pkill nginx 或者 $ killall nginx # 如果现实没有killall命令,执行:yum install -y psmiscnginx配置文件详解nginx.conf配置文件全局结构大致如下:全局配置(user,worker_process,error_log,pid)events(网络连接部分,worker_connections)http(最重要的部分,大部分功能都在这里)server(虚拟主机相关,在http块里)location(server里面)全局配置部分user nobody;# 定义运行nginx服务的用户,还可以加上组,如 user nobody nobody;worker_processes 1;# 定义nginx子进程数量,即提供服务的进程数量,该数值建议和服务cpu核数保持一致。# 除了可以定义数字外,还可以定义为auto,表示让系统自动调整。error_log logs/error.log;# 定义错误日志的路径,可以是相对路径(相对prefix路径的),也可以是绝对路径。# 该配置可以在此处定义,也可以定义到http、server、location里。error_log logs/error.log notice;# 定义错误日志路径以及日志级别.# 错误日志级别:常见的错误日志级别有[debug|info|notice|warn|error|crit|alert|emerg],级别越高记录的信息越少。# 如果不定义默认是errorpid logs/nginx.pid;# 定义nginx进程pid文件所在路径,可以是相对路径,也可以是绝对路径。worker_rlimit_nofile 100000;# 定义nginx最多打开文件数限制。如果没设置的话,这个值为操作系统(ulimit -n)的限制保持一致。# 把这个值设高,nginx就不会有“too many open files”问题了。events配置部分worker_connections 1024;定义每个work_process同时开启的最大连接数,即允许最多只能有这么多连接。accept_mutex on;当某一个时刻只有一个网络连接请求服务器时,服务器上有多个睡眠的进程会被同时叫醒,这样会损耗一定的服务器性能。Nginx中的accept_mutex设置为on,将会对多个Nginx进程(worker processer)接收连接时进行序列化,防止多个进程争抢资源。 默认就是on。multi_accept on;nginx worker processer可以做到同时接收多个新到达的网络连接,前提是把该参数设置为on。默认为off,即每个worker process一次只能接收一个新到达的网络连接。use epoll;Nginx服务器提供了多个事件驱动器模型来处理网络消息。其支持的类型有:select、poll、kqueue、epoll、rtsing、/dev/poll以及eventport。select:只能在Windows下使用,这个事件模型不建议在高负载的系统使用poll:Nginx默认首选,但不是在所有系统下都可用kqueue:这种方式在FreeBSD 4.1+, OpenBSD2.9+, NetBSD 2.0, 和 MacOS X系统中是最高效的epoll: 这种方式是在Linux 2.6+内核中最高效的方式rtsig:实时信号,可用在Linux 2.2.19的内核中,但不适用在高流量的系统中/dev/poll: Solaris 7 11/99+,HP/UX 11.22+, IRIX 6.5.15+, and Tru64 UNIX 5.1A+操作系统最高效的方式eventport: Solaris 10最高效的方式http配置部分官方文档 http://nginx.org/en/docs/参考链接: https://segmentfault.com/a/11…参考链接: https://segmentfault.com/a/11…参考链接:http的header https://kb.cnblogs.com/page/9…常见配置:include mime.types; //cat conf/mime.types定义nginx能识别的网络资源媒体类型(如,文本、html、js、css、流媒体等)default_type application/octet-stream;定义默认的type,如果不定义改行,默认为text/plain.log_format main ‘$remote_addr - $remote_user [$time_local] “$request” ’ ‘$status $body_bytes_sent “$http_referer” ’ ‘"$http_user_agent" “$http_x_forwarded_for”’;定义nginx日志格式,其中main为日志格式的名字,后面的为nginx的内部变量组成的一串字符串。access_log logs/access.log main; 定义日志的路径以及采用的日志格式,该参数可以在server配置块中定义。sendfile on;是否调用sendfile函数传输文件,默认为off,使用sendfile函数传输,可以减少user mode和kernel mode的切换,从而提升服务器性能。对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。sendfile_max_chunk 128k;该参数限定Nginx worker process每次调用sendfile()函数传输数据的最大值,默认值为0,如果设置为0则无限制。tcp_nopush on;当tcp_nopush设置为on时,会调用tcp_cork方法进行数据传输。使用该方法会产生这样的效果:当应用程序产生数据时,内核不会立马封装包,而是当数据量积累到一定量时才会封装,然后传输。这样有助于解决网络堵塞问题。默认值为on。举例:快递员收快递、发快递,包裹累积到一定量才会发,节省运输成本。keepalive_timeout 65 60;该参数有两个值,第一个值设置nginx服务器与客户端会话结束后仍旧保持连接的最长时间,单位是秒,默认为75s。第二个值可以省略,它是针对客户端的浏览器来设置的,可以通过curl -I看到header信息中有一项Keep-Alive: timeout=60,如果不设置就没有这一项。第二个数值设置后,浏览器就会根据这个数值决定何时主动关闭连接,Nginx服务器就不操心了。但有的浏览器并不认可该参数。send_timeout这个超时时间是发送响应的超时时间,即Nginx服务器向客户端发送了数据包,但客户端一直没有去接收这个数据包。如果某个连接超过send_timeout定义的超时时间,那么Nginx将会关闭这个连接。client_max_body_size 10m;浏览器在发送含有较大HTTP包体的请求时,其头部会有一个Content-Length字段,client_max_body_size是用来限制Content-Length所示值的大小的。这个限制包体的配置不用等Nginx接收完所有的HTTP包体,就可以告诉用户请求过大不被接受。会返回413状态码。例如,用户试图上传一个1GB的文件,Nginx在收完包头后,发现Content-Length超过client_max_body_size定义的值,就直接发送413(Request Entity Too Large)响应给客户端。gzip on;是否开启gzip压缩。gzip_min_length 1k;设置允许压缩的页面最小字节数,页面字节数从header头得content-length中进行获取。默认值是20。建议设置成大于1k的字节数,小于1k可能会越压越大。gzip_buffers 4 16k;设置系统获取几个单位的buffer用于存储gzip的压缩结果数据流。4 16k代表分配4个16k的buffer。gzip_http_version 1.1;用于识别 http 协议的版本,早期的浏览器不支持 Gzip 压缩,用户会看到乱码,所以为了支持前期版本加上了这个选项。如果你用了Nginx反向代理并期望也启用Gzip压缩的话,由于末端通信是http/1.1,故请设置为 1.1。gzip_comp_level 6;gzip压缩比,1压缩比最小处理速度最快,9压缩比最大但处理速度最慢(传输快但比较消耗cpu)gzip_types mime-type … ;匹配mime类型进行压缩,无论是否指定,”text/html”类型总是会被压缩的。在conf/mime.conf里查看对应的type。示例:gzip_types text/plain application/x-javascript text/css text/html application/xml;gzip_vary on;和http头有关系,会在响应头加个 Vary: Accept-Encoding ,可以让前端的缓存服务器缓存经过gzip压缩的页面,例如,用Squid缓存经过Nginx压缩的数据。gzip_proxied any;Nginx作为反向代理的时候启用,决定开启或者关闭后端服务器返回的结果是否压缩,匹配的前提是后端服务器必须要返回包含”Via”的 header头。 以下为可用的值:off - 关闭所有的代理结果数据的压缩expired - 启用压缩,如果header头中包含 “Expires” 头信息no-cache - 启用压缩,如果header头中包含 “Cache-Control:no-cache” 头信息no-store - 启用压缩,如果header头中包含 “Cache-Control:no-store” 头信息private - 启用压缩,如果header头中包含 “Cache-Control:private” 头信息 no_last_modified - 启用压缩,如果header头中不包含 “Last-Modified” 头信息no_etag - 启用压缩 ,如果header头中不包含 “ETag” 头信息auth - 启用压缩 , 如果header头中包含 “Authorization” 头信息 any - 无条件启用压缩nginx服务优化虚拟主机1、虚拟主机概念虚拟主机指的是,在web服务里是一个独立的网站站点,这个站点对应独立的域名,也可能是IP或端口,具有独立的程序及资源目录,可以独立地对外提供服务供用户访问。Nginx软件是使用一个server{}标签来标识一个虚拟主机的。一个web服务里可以有多个虚拟主机标签对,即可同时支持多个虚拟主机站点。2、虚拟主机类型常见的虚拟主机类型分三种基于域名的虚拟主机基于端口的虚拟主机基于IP的虚拟主机基于域名的虚拟主机是通过不同域名区分不同的虚拟主机,是企业应用最广泛的虚拟主机类型。基于端口的虚拟主机是通过不同端口区分不同的虚拟主机,常用于公司内部的网站,比如不希望用户访问的网站后台等。基于IP地址的虚拟主机是通过不同IP地址区分不同的虚拟主机,不常用很少见。3、基于域名的虚拟主机配置第一、编辑nginx配置文件nginx.conf,找到http{}块,在http{}块里面添加server{}标签,一个server{}代表一个虚拟主机。默认nginx.conf中有一个server{},这里修改一下,并配置两个基于域名的虚拟主机。配置内容如下:server { listen 80; server_name www.syushin.com; location / { root html/com; index index.html index.htm; } }server { listen 80; server_name www.syushin.org; location / { root html/org; index index.html index.htm; } } 可以看到基于域名的虚拟是在server_name中定义。第二、创建域名对应的站点目录及文件。$ mkdir ../html/com ../html/org$ echo “I am syushin.com” >> ../html/com/index.html$ echo “I am syushin.org” >> ../html/org/index.html第三、配置域名解析linux下echo “192.168.30.7 www.syushin.com www.syushin.org” >> /etc/hostswindows下找到域名解析文件,通常在C:\Windows\System32\drivers\etc\hosts添加内容:192.168.30.7 www.syushin.com www.syushin.org第四、检查nginx语法,重新加载$ /usr/local/nginx/sbin/nginx -t$ /usr/local/nginx/sbin/nginx -s reload第五、测试linux下用curl命令测试[root@lnmp conf]$ curl www.syushin.comI am syushin.com[root@lnmp conf]$ curl www.syushin.orgI am syushin.orgwindows下用浏览器访问这样就可以实现基于域名的虚拟主机了,用户输入不同的域名,访问不同的站点内容。而基于端口的虚拟主机是在server{}标签里的listen处修改监听的端口,比如listen 8080;或者listen 8090;基于IP地址也是在listen里修改,格式如下:192.168.30.7:80;或者192.168.30.8:81都很简单,就不再实际操作了。规范优化nginx配置文件nginx主配置文件是nginx.conf,可以将主配置文件包含所有虚拟主机的子配置文件统一放入extra目录里。使用include参数实现,它可以放在nginx配置文件的任何地方,用法示例如下:$ include extra/web01.conf下面是我的使用方案:$ vim nginx.conf在http{}删除默认的server{}标签,使用include extra/.conf;http{ include mime.types; default_type application/octet-stream; …(这里省略) include extra/.conf; #就是这一行}创建虚拟主机配置保存的目录$ mkdir /usr/local/nginx/conf/extra进入extra目录,创建虚拟主机配置文件。$ vim web01.conf# 内容如下server { listen 80; server_name localhost; index index.html index.htm ; root html; }这样通过主配置文件加上include包含的配置使得Nginx配置更加简单,清晰,规范。域名重定向在一个虚拟主机上有多个域名的时候,可以针对这多个域名做域名重定向。即访问A域名,浏览器会跳转到B域名。server { listen 80; server_name www.syushin.com blog.syushin.cc; if ($host = ‘blog.syushin.cc’ ) { rewrite /(.) http://syushin.com/$1 permanent; } index index.html index.htm index.php; root html/web01;}虚拟主机配置如上:其中if语句就是域名重定向的配置了。$host变量就是域名,当访问域名是blog.syushin.cc的时候,就将域名跳转到www.syushin.com。测试:[root@lnmp ~]$ curl -x127.0.0.1:80 www.syushin.com -IHTTP/1.1 200 OK # 正常访问状态码200Server: nginx/1.14.2Date: Sun, 10 Mar 2019 13:00:16 GMTContent-Type: text/htmlContent-Length: 12Last-Modified: Sun, 10 Mar 2019 12:38:09 GMTConnection: keep-aliveETag: “5c850531-c"Accept-Ranges: bytes[root@lnmp ~]$ curl -x127.0.0.1:80 blog.syushin.cc -I HTTP/1.1 301 Moved Permanently # 状态码301Server: nginx/1.14.2Date: Sun, 10 Mar 2019 13:00:25 GMTContent-Type: text/htmlContent-Length: 185Connection: keep-aliveLocation: http://www.syushin.com/ # 重定向域名用户认证nginx访问日志nginx访问日志就是用户访问网站的记录。可以针对不同格式记录日志。配置nginx访问日志格式(这里只使用其中一部分): # 在nginx主配置文件中的http{}块里定义 log_format main ‘$remote_addr $http_x_forwarded_for [$time_local]’ ’ $host “$request_uri” $status’ ’ “$http_referer” “$http_user_agent”’;参数说明:变量描述$remote_addr客户端IP(公网IP)$http_x_forwarded_for代理服务器的IP$time_local服务器本地时间$host访问主机名(域名)$request_url访问的url地址$status状态码$http_refererreferer$http_user_agentuser_agent虚拟主机配置文件爬配置nginx访问日志保存目录以及使用主配置文件里的日志格式:server { listen 80; server_name www.syushin.com blog.syushin.cc; if ($host = ‘blog.syushin.cc’ ) { rewrite /(.) http://www.syushin.com/$1 permanent; } index index.html index.htm index.php; root html/web01; location ~ .php$ { include fastcgi_params; fastcgi_pass unix:/tmp/php-fcgi.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /usr/local/nginx/html$fastcgi_script_name; } access_log /var/log/nginx/syushin_access.log main; # 这一行就是配置访问日志}创建日志文件目录$ mkdir -p /var/log/nginx检查语法、重新加载[root@lnmp conf]$ $ /usr/local/nginx/sbin/nginx -tnginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is oknginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful[root@lnmp conf]$ /usr/local/nginx/sbin/nginx -s reload测试,浏览器访问一次域名和在本地curl一下,查看是否有日志生成。[root@lnmp nginx]$ curl -x127.0.0.1:80 blog.syushin.cc <html><head><title>301 Moved Permanently</title></head><body bgcolor=“white”><center><h1>301 Moved Permanently</h1></center><hr><center>nginx/1.14.2</center></body></html>[root@lnmp nginx]$ cat syushin_access.log 192.168.30.1 - [11/Mar/2019:12:55:01 +0800] www.syushin.com “/” 304 “-” “Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko"127.0.0.1 - [11/Mar/2019:12:56:32 +0800] blog.syushin.cc “/” 301 “-” “curl/7.29.0"这样配置访问日志就成功了。日志切割生产环境下,访问日志的量是很大的,如果把访问日志都放在一个文件里是会有很大影响的。因此将nginx访问日志进行切割是很有必要的。如何切割日志?Linux有个日志切割工具logrotate。它的配置文件在/etc/logrotate.conf查看配置文件# see “man logrotate” for details# rotate log files weeklyweekly# keep 4 weeks worth of backlogsrotate 4# create new (empty) log files after rotating old onescreate# use date as a suffix of the rotated filedateext# uncomment this if you want your log files compressed#compress# RPM packages drop log rotation information into this directoryinclude /etc/logrotate.d# no packages own wtmp and btmp – we’ll rotate them here/var/log/wtmp { monthly create 0664 root utmp minsize 1M rotate 1}/var/log/btmp { missingok monthly create 0600 root utmp rotate 1}其中weekly表示按周切割;rotate 4表示一次存储4个归档文件,对于第5个归档文件,时间最久的文档会被覆盖;create以指定的权限创建全新的日志文件,同时logrotate也会重命名原始日志文件。dataext表示以日期为格式命令新的日志文件/var/log/wtmp { monthly create 0664 root utmp minsize 1M rotate 1 }上面代码块表示针对/var/log/wtmp这个目录下做日志切割,时间为一个月,只对文件大小大于1M文件进行切割。对于nginx的日志切割如果是yum安装的nginx,logrotate已经有默认的切割策略了/etc/logrotate.d/nginx。而编译安装的nginx就没有,需要手动定义,也可以用这个日志配置$ cat /etc/logrotate.d/nginx /var/log/nginx/.log { daily rotate 5 missingok notifempty create 644 www www postrotate if [ -f /application/nginx/logs/nginx.pid ]; then kill -USR1 cat /application/nginx/logs/nginx.pid fiendscript}logrotate工具对于防止因庞大的日志文件而耗尽存储空间是十分有用的。配置完毕后,进程是全自动的,可以长时间在不需要人为干预下运行。除了样例之外,自己还可以定制不同的样式满足需求。访问日志不记录静态文件在访问日志里,过滤掉一些图片、js、css等的请求日志。因为这样的日志没有多大意义,而且会占用很大的磁盘空间。配置,编辑虚拟主机配置文件,添加location:location ~ .(png|jpeg|jpg|gif|js|css|bmp)$ { access_log off; }上面规则表示凡是匹配到以.png|jpeg|jpg|gif|js|css|bmp结尾的文件,访问日志功能就关闭,即不记录访问静态文件的访问记录。*号表示不区分大小写,.号前面需要只用转义字符,|表示或者。测试在虚拟主机站点目录里添加资源文件test.png,然后curl访问一下、再查看日志是否有记录这条访问记录,如果没有则表示配置成功。清空日志$ > /var/log/nginx/syushin_access.log 创建以png结尾的文件$ touch /usr/local/nginx/html/web01/test.png 访问# 成功访问[root@lnmp web01]$ curl -x127.0.0.1:80 www.syushin.com/test.png -IHTTP/1.1 200 OKServer: nginx/1.14.2Date: Mon, 11 Mar 2019 05:19:58 GMTContent-Type: image/pngContent-Length: 0Last-Modified: Mon, 11 Mar 2019 05:16:14 GMTConnection: keep-aliveETag: “5c85ef1e-0"Accept-Ranges: bytes查看日志[root@lnmp web01]# cat /var/log/nginx/syushin_access.log [root@lnmp web01]# 无日志记录,说明配置成功。防盗链盗链是指服务提供商自己不提供服务的内容,通过技术手段绕过其它有利益的最终用户界面(如广告),直接在自己的网站上向最终用户提供其它服务提供商的服务内容,骗取最终用户的浏览和点击率。受益者不提供资源或提供很少的资源,而真正的服务提供商却得不到任何的收益。防盗链就是防止上面情况的。常见的盗链是图片盗链,音频盗链,文件盗链。Referer 防盗链Referer在HTTP协议里有特殊的用途,当浏览器向服务器发送请求时,一般会带上Referer头,告知服务器该请求是从哪个页面链接过来的。Referer经常被用于页面访问统计、图片防盗链等。配置图片防盗链location ~ .(png|gif|jpeg|bmp|mp3|mp4|flv)$ { valid_referers none blocked server_name .syushin.com; if ($invalid_referer){ return 403; } }valid referers指的是白名单内的域名可以引用站点图片none表示空referer,即直接打开站点的图片,而不是从其他网站打开本站点的图片文件,因此对直接访问站点内容的不做限制。blocked指的是非法链接server_name就是虚拟主机域名后面的.syushin.com就是白名单域名这样配置后,当从其他网站引用本站的图片的时候,就引用不了了。测试:使用curl -e选项测试,-e指定referer$ curl -I -e “http://www.aaa.com/1.txt" http://www.syushin.com/test.png出现403说明配置成功访问控制负载均衡 ...

March 11, 2019 · 4 min · jiezi

CentOS7安装LNMP(nginx1.14.2、mariadb10.3.13、php7.3.3)

前言系统环境[root@lnmp mysql]# cat /etc/redhat-release CentOS Linux release 7.3.1611 (Core) [root@lnmp mysql]# uname -r3.10.0-514.el7.x86_64官方下载地址mariadb数据库phpngixn安装mariadb10.3.131. 下载mariadb二进制包由于源码包编译时间过长就不选用了,而选用已经编译过的二进制包$ wget https://mirrors.shu.edu.cn/mariadb//mariadb-10.3.13/bintar-linux-x86_64/mariadb-10.3.13-linux-x86_64.tar.gz2. 解压$ tar -zxvf mariadb-10.3.13-linux-x86_64.tar.gz3. 将解压后的二进制包放置软件目录这里我习惯放置在/usr/local下,并改名mysql$ mv mariadb-10.3.13-linux-x86_64 /usr/local/mysql4. 创建数据存储目录与管理用户mysql$ groupadd mysql$ useradd -s /sbin/nologin -M mysql$ cd /usr/local/mysql$ chown -R mysql:mysql .5.初始化$ ./scripts/mysql_install_db –user=mysql –basedir=/usr/local/mysql –datadir=/usr/local/mysql/data这一步如果报错:/usr/local/mariadb/bin/mysqld: error while loading shared libraries: libaio.so.1: cannot open shared object file: No such file or directory 解决:yum install -y libaio-devel6.检查是否安装成功在初始化命令之后使用$ ech $?,查看返回结果是否为0,为0表示成功,不为0表示失败。 7.拷贝启动脚本,并用chkconfig工具管理$ cd /usr/local/mysql$ cp support-files/mysql.server /etc/init.d/mysqld# 定义启动脚本内容,修改datadir和basedir$ vim /etc/init.d/mysqld# 修改basedir=/usr/local/mysql # 软件的目录datadir==/usr/local/mysql/data # 存放数据目录# 修改完,设置开机自启动$ chkconfig –add mysqld$ chkconfig mysqld on8.设置mariadb配置文件/etc/my.cnf$ vim /etc/my.cnf# 修改配置内容为datadir=/usr/local/mysql/datasocket=/tmp/mysql.socklog-error=/usr/local/mysql/data/mariadb.logpid-file=/usr/local/mysql/data/mariadb.pid保存退出。9. 启动mariadb服务$ /etc/init.d/mysqld start #启动mariadb10. 查看端口进程[root@lnmp mysql]$ netstat -lntp | grep mysqltcp6 0 0 :::3306 :::* LISTEN 4225/mysqld [root@lnmp mysql]$ ps aux | grep mysqlroot 4140 0.0 0.0 115436 1756 ? S 13:31 0:00 /bin/sh /usr/local/mysql/bin/mysqld_safe –datadir=/usr/local/mysql/data –pid-file=/usr/local/mysql/data/lnmp.pidmysql 4225 0.0 4.8 1713716 90736 ? Sl 13:31 0:00 /usr/local/mysql/bin/mysqld –basedir=/usr/local/mysql –datadir=/usr/local/mysql/data –plugin-dir=/usr/local/mysql/lib/plugin –user=mysql –log-error=/usr/local/mysql/data/mariadb.log –pid-file=/usr/local/mysql/data/lnmp.pid –socket=/tmp/mysql.sockroot 4280 0.0 0.0 112728 964 pts/1 S+ 13:43 0:00 grep –color=auto mysql 11. 进入mariadb数据库 $ /usr/local/mysql/bin/mysql Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 10 Server version: 10.3.13-MariaDB MariaDB Server Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the current input statement. MariaDB [(none)]> 12. 设置软连接$ ln -s /usr/local/mysql/bin/mysql /usr/bin $ ln -s /usr/local/mysql/bin/mysqladmin /usr/bin13. 设置root密码$ mysqladmin -u root -p ‘!@#123qwe'14. root用户登录mysql[root@lnmp mysql]# mysql -u root -pEnter password: Welcome to the MariaDB monitor. Commands end with ; or \g.Your MariaDB connection id is 16Server version: 10.3.13-MariaDB MariaDB ServerCopyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the current input statement.MariaDB [(none)]> 至此mariadb安装完毕。安装php7.3.31. 下载软件包下载地址:http://php.net/get/php-7.3.3.tar.bz2/from/a/mirror选择中国镜像站点下载,或者复制链接地址wget下载也可以。这里我是先下载到我的window再上传到linux。2. 解压$ tar -jxvf php-7.3.3.tar.bz2 # 如果没有安装bzip2工具会报错$ yum install -y bzip23. 安装依赖包$ yum install -y gcc libxml2-devel zlib-devel openssl-devel bzip2-devel libjpeg-devel libpng-devel epel-release libmcrypt-devel curl-devel freetype-devel4. 编译参数$ ./configure –prefix=/usr/local/php-fpm –with-config-file-path=/usr/local/php/etc –enable-fpm –with-fpm-user=php-fpm –with-fpm-group=php-fpm –with-mysql=mysqlnd –with-mysqli=mysqlnd –with-pdo-mysql=mysqlnd –with-mysql-sock=/tmp/mysql.sock –with-libxml-dir –with-gd –with-jpeg-dir –with-png-dir –with-freetype-dir –with-iconv-dir –with-zlib-dir –with-mcrypt –enable-soap –enable-gd-native-ttf –enable-ftp –enable-mbstring –enable-exif –with-pear –with-curl –with-openssl5. 安装make && make install6. 拷贝配置文件$ cp /usr/local/src/php-7.3.3/php.ini-development /usr/local/php-fpm/etc/php.ini$ cp /usr/local/php-fpm/etc/php-fpm.conf.default /usr/local/php-fpm/etc/php-fpm.conf7. 配置启动脚本设置开机启动$ cp /usr/local/src/php-7.3.3/sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm$ chmod +x php-fpm$ chkconfig –add php-fpm$ chkconfig php-fom on8. 创建用户,配置pool$ useradd php-fpm$ cp /usr/local/php-fpm/etc/php-fpm.d/www.conf.default /usr/local/php-fpm/etc/php-fpm.d/www.conf9.启动服务,查看进程[root@lnmp ~]$ service php-fpm startStarting php-fpm done[root@lnmp ~]$ ps aux | grep php-fpmroot 18747 0.0 0.3 115992 6284 ? Ss 13:27 0:00 php-fpm: master process (/usr/local/php-fpm/etc/php-fpm.conf)php-fpm 18748 0.0 0.3 115992 5836 ? S 13:27 0:00 php-fpm: pool wwwphp-fpm 18749 0.0 0.3 115992 5836 ? S 13:27 0:00 php-fpm: pool wwwroot 18751 0.0 0.0 112724 988 pts/0 S+ 13:27 0:00 grep –color=auto php-fpm[root@lnmp ~]$ netstat -lntp | grep php-fpmtcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 18747/php-fpm: mast php安装完毕。编译安装nginx1.14.21. 下载软件包$ cd /usr/local/src$ wget http://nginx.org/download/nginx-1.14.2.tar.gz2. 解压$ tar -zxvf nginx-1.14.2.tar.gz 3. 编译安装$ cd nginx-1.14.2$ ./configure –prefix=/usr/local/nginx –with-http_stub_status_module –with-http_ssl_module$ make && make install4. 添加nginx启动脚本$ vim /etc/init.d/nginx内容如下:#!/bin/bash# chkconfig: - 30 21# description: http service.# Source Function Library. /etc/init.d/functions# Nginx SettingsNGINX_SBIN="/usr/local/nginx/sbin/nginx"NGINX_CONF="/usr/local/nginx/conf/nginx.conf"NGINX_PID="/usr/local/nginx/logs/nginx.pid"RETVAL=0prog=“Nginx"start() { echo -n $“Starting $prog: " mkdir -p /dev/shm/nginx_temp daemon $NGINX_SBIN -c $NGINX_CONF RETVAL=$? echo return $RETVAL}stop() { echo -n $“Stopping $prog: " killproc -p $NGINX_PID $NGINX_SBIN -TERM rm -rf /dev/shm/nginx_temp RETVAL=$? echo return $RETVAL}reload(){ echo -n $“Reloading $prog: " killproc -p $NGINX_PID $NGINX_SBIN -HUP RETVAL=$? echo return $RETVAL}restart(){ stop start}configtest(){ $NGINX_SBIN -c $NGINX_CONF -t return 0}case “$1” in start) start ;; stop) stop ;; reload) reload ;; restart) restart ;; configtest) configtest ;; ) echo $“Usage: $0 {start|stop|reload|restart|configtest}” RETVAL=1esacexit $RETVAL5. 设置nginx开机启动$ chmod +x /etc/init.d/nginx$ chkconfig –add nginx$ chkconfig nginx on6. 启动nignx,查看进程端口[root@lnmp nginx-1.14.2]$ /etc/init.d/nginx startStarting nginx (via systemctl): [ 确定 ][root@lnmp nginx-1.14.2]$ ps aux | grep nginxroot 21486 0.0 0.0 45948 1120 ? Ss 13:50 0:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.confnobody 21487 0.0 0.1 46384 1900 ? S 13:50 0:00 nginx: worker processroot 21489 0.0 0.0 112724 988 pts/0 S+ 13:50 0:00 grep –color=auto nginx[root@lnmp nginx-1.14.2]$ netstat -lntp | grep nginxtcp 0 0 0.0.0.0:80 0.0.0.0: LISTEN 21486/nginx: master 至此nginx安装完毕。 ...

March 10, 2019 · 3 min · jiezi

Linux文件与目录管理

基础中的基础,趁着面试前复习过一遍。基础命令基本命令pwd命令作用:显示当前工作目录的名称选项:-p 显示链接的真实路径cd命令作用:切换当前工作目录常用:cd 切换到根目录cd - 返回到前一个工作目录cd .. 切换工作目录到当前目录的上一级目录cd /usr/local 切换工作目录到/usr/localls命令作用:显示目录与文件信息常用选项:-a 显示所有文件,包括以.开头的隐藏文件-h 人性化显示容量信息-l 长格式显示文档的详细信息-u 显示文件或目录最后被访问的时间-t 以修改时间排序,ls默认按文件名称排序-R 递归显示子目录touch命令作用:创建文件或者修改文件时间如:$ touch hello.txt如果hello.txt文件不存在,则创建文件,如果存在,则修改hello.txt所有的时间为当前系统的时间。mkdir命令作用:创建目录选项:-p 创建多级目录如:$ mkdir -p /tmp/data/mysql假如/tmp/data目录不存在,就会自动创建/data目录再创建mysql目录。cp命令作用:复制文件或者目录选项:-r 递归,复制子文件与子目录(复制目录必加)-a 复制时保留源文档的所有属性rm命令作用:删除文件或者目录选项:-f 不提示,强制删除-i 删除前,提示是否删除-r 递归删除,删除目录以及目录下的所有内容需谨慎:rm -rf *mv命令作用:移动或者重命名文件或目录如:重命名文件$ mv hello.txt hello.doc移动文件到指定目录$ mv hello.txt /usr/local/src移动文件到指定目录并改名$ mv hello.txt /usr/local/src/hello.docdu命令作用:计算文件或目录的大小(容量)选项:-h 人性化显示容量信息-a 查看所有目录以及文件的容量信息-s 仅显示总容量查看文件内容命令cat命令作用:查看文件内容选项:-b 显示行号,空白行不显示行号-n 显示行号,包含空白行示例:[root@moli_linux1 ~]$ cat -b hello.txt 1 one:hello world 2 two:hello world[root@moli_linux1 ~]$ cat -n hello.txt 1 one:hello world 2 3 two:hello worldtac命令作用:倒序查看文件内容(与cat相反)[root@moli_linux1 ~]$ tac hello.txt two:hello worldone:hello worldhead命令作用:查看文件头部内容,默认显示前10行。选项:-c nK 显示文件前nKB的内容-n 显示文件前n行内容示例:head -5 /etc/passwd 显示/etc/passwd文件前5行内容。tail命令作用:查看文件尾部内容,默认显示末尾10行。选项:-c nK 显示文件前nKB的内容-n 显示文件前n行内容示例:tail -5 /etc/passwd 显示/etc/passwd文件后5行内容。less命令作用:分页查看文件内容说明:按空格键查看下一页,q键退出查看,ctrl b向上翻页,ctrl f向下翻页,g跳到第一行,G跳到最后一行。示例:less /var/log/jenkins/jenkins.logmore命令作用:分页查看文件内容说明:按空格键查看下一页,q键退出查看,ctrl b向上翻页,ctrl f向下翻页示例:more /var/log/jenkins/jenkins.logwc命令作用:显示文件行,单词与字节统计信息选项:-c 显示文件字节统计信息-l 显示文件行数统计信息-w 显示文件单词统计信息示例:[root@moli_linux1 ~]$ wc hello.txt 3 4 33 hello.txt[root@moli_linux1 ~]$ wc -c hello.txt 33 hello.txt[root@moli_linux1 ~]$ wc -l hello.txt 3 hello.txt[root@moli_linux1 ~]$ wc -w hello.txt 4 hello.txt权限管理Linux下文件的权限一般包括读、写、可执行三种控制,可用字母或者数字表示。字母表示为为r、w、x数字表示为4、2、1也就是r=4,w=2,x=1。我们可以使用ls -l命令查看文件或者目录的权限。[root@moli_linux1 ~]$ ls -l总用量 8drwxr-xr-x. 3 root root 23 6月 6 2018 192.168.229-rw——-. 1 root root 1538 5月 19 2018 anaconda-ks.cfgdrwxr-xr-x. 3 root root 18 7月 27 2018 git_data-rw-r–r– 1 root root 33 3月 5 13:37 hello.txtdrwxr-xr-x. 4 root root 33 7月 4 2018 serverdrwxr-xr-x 4 root root 68 10月 2 15:48 shell-100drwxr-xr-x 4 root root 67 11月 16 21:29 test-find其中第一列的第一个字符表示文件类型,之后的9个字符就是权限了,而第一列最后一个字符有的是一个点.,有的没有,这个点代表这个文件受selinux所限制。以上面的drwxr-xr-x.为例:第一个字符是字母d,表示文件类型是目录,常见的有:字母l代表链接文件、字母b或者c代表设备、字母s代表socket文件等。第二个字符到第九个字符代表权限。三位一组分别为所有者(a)权限,所属组(g)权限、其他用户(o)权限。这个文件的权限为所有者权限可读可写可执行、所属组权限为可读可执行不可写、其他用户权限可执行不可读不可写。最后一个字符是点,表示受selinux限制。关于权限的表示可看下表:数字字母文件目录4r查看文件内容查看目录下的文件与目录名称2w修改文件内容在目录下增、删、改文件与目录名称1x可执行,一般为程序或者脚本可用cd命令进入目录Linux默认权限文件默认权限文件默认最大权限为644 (rw-r–r–)一般会给文件644权限目录默认权限目录默认最大权限为755(rwxr-xr-x)一般会给目录755权限chmod命令作用:修改文件或者目录的权限格式:chmod [选项] 权限 文件或目录选项:-R 递归将权限应用于所有的子目录与子文件其中权限的表示可用数字或者字母,也可以用a(所有人)、u(代表所有者)、g(所属组)、o(其他用户)。示例:环境准备,test目录下有3个文件和1个目录test-1,子目录test-1里有文件hello.txt。各个文件目录权限如下:[root@moli_linux1 test]$ ll -R.:总用量 0-rw-r–r– 1 root root 0 3月 7 14:43 1.txt-rw-r–r– 1 root root 0 3月 7 14:43 2.txt-rw-r–r– 1 root root 0 3月 7 14:43 3.txtdrwxr-xr-x 2 root root 23 3月 7 14:44 test-1./test-1:总用量 0-rw-r–r– 1 root root 0 3月 7 14:44 hello.txt[root@moli_linux1 test]$ tree.├── 1.txt├── 2.txt├── 3.txt└── test-1 └── hello.txt1 directory, 4 files修改1.txt文件的权限为600$ chmod 600 1.txt 或者 $ chmod u=rwx,g-r,o-r 1.txt 对1.txt文件的所有人权限添加可执行权限$ chmod a+x 1.txt 或者 $ chmod u+x,g+x,o+x 1.txt对test目录下的所有文件设置所有人可读可写$ chmod -R a=rw test建议:修改权限能用数字就用数字…chown命令作用:修改文件或目录的所有者与所属组格式:chown [选项] [所有者]:[所属组] 文件名/目录名选项:-R 递归将权限应用于所有子目录与子文件使用ls -l命令查看文件或目录的时候,第三列和第四列就是文件或目录的所有者与所属组。[root@moli_linux1 test]$ ls -l 1.txt -rwx—— 1 root root 0 3月 7 14:43 1.txt比如上面1.txt文件的所有者是root用户,所属组是root组。修改1.txt文件的所有者为mori,所属组为mail[root@moli_linux1 test]$ chown mori:mail 1.txt [root@moli_linux1 test]$ ll 1.txt -rwx—— 1 mori mail 0 3月 7 14:43 1.txt# 所有者与所属组已改变umaskLinux默认权限控制,也就是说umask的作用是设置用户创建文件或者目录时,这个文件或目录的默认权限。在Linux终端输入umask时,出现数字0022这个就是默认的umask值。[root@moli_linux1 test]$ umask0022修改umask 我们可以通过输入命令$ umask 0032修改系统默认的umask值[root@moli_linux1 test]$ umask 0032[root@moli_linux1 test]$ umask0032umask反掩码计算当umask掩码是偶数的时候,默认权限=最大权限-umask值文件最大权限是666,因此创建文件的默认权限是666-022=644目录最大权限是777,因此创建目录的默认权限是777-022=755当umask掩码是奇数的时候,计算文件的默认权限的时候,要在奇数位加1如:umask=032对于文件:666-032=634,然后奇数位+1,634+010=644对于目录:777-032=745,然后奇数位+1,745+010=755文件系统权限设置文件系统权限命令chattrchattr +a(append) 只能追加chattr +i 无敌,不能进行任何操作查看文件系统权限命令lsattr示例:[root@moli_linux1 test]$ ll 2.txt -rw-r–r– 1 root root 0 3月 7 14:43 2.txt[root@moli_linux1 test]$ chattr +a 2.txt # 添加隐藏权限[root@moli_linux1 test]$ echo “hello world” > 2.txt # 不允许重定向-bash: 2.txt: 不允许的操作[root@moli_linux1 test]$ echo “hello world” >> 2.txt # 允许追加重定向[root@moli_linux1 test]$ mv 2.txt helloworld.txt # 不允许移动 mv: 无法将"2.txt" 移动至"helloworld.txt": 不允许的操作[root@moli_linux1 test]$ rm -f 2.txt # 不允许删除rm: 无法删除"2.txt": 不允许的操作[root@moli_linux1 test]$ lsattr 2.txt #查看隐藏权限—–a———- 2.txt[root@moli_linux1 test]# chattr -a 2.txt # 去除隐藏权限 [root@moli_linux1 test]$ lsattr 2.txt # 没有隐藏权限—————- 2.txt[root@moli_linux1 test]$ rm -f 2.txt # 再次删除,成功链接文件Linux中链接文件分为软连接和硬链接。软连接可以跨分区,但源文件不可删除。硬链接不可以跨分区,但可以将源文件删除。创建软硬链接使用命令ln 创建软连接:ln -s 文件名 链接名创建硬链接:ln 文件名 链接名软连接软链接就是一个普通文件,只是数据块内容有点特殊。软链接有着自己的 inode 号以及用户数据块。因此软链接的创建与使用没有类似硬链接的诸多限制:软链接有自己的文件属性及权限等;可对不存在的文件或目录创建软链接;软链接可交叉文件系统;即,可跨分区。软链接可对文件或目录创建;创建软链接时,链接计数 i_nlink 不会增加;删除软链接并不影响被指向的文件,但若被指向的原文件被删除,则相关软连接被称为死链接(即 dangling link,若被指向路径文件被重新创建,死链接可恢复为正常的软链接)。示例:[root@moli_linux1 ~]$ ln -s /test/hello.txt /tmp/hi.txt #创建文件软连接[root@moli_linux1 ~]$ ln -s /test/ /var/test #创建目录软连接[root@moli_linux1 ~]$ rm /test/hello.txt;cat /tmp/hi.txt #删除源文件后,链接无法使用硬链接由于硬链接是有着相同 inode 号仅文件名不同的文件,因此硬链接存在以下几点特性:文件有相同的 inode 及 data block;只能对已存在的文件进行创建;不能交叉文件系统进行硬链接的创建;不能对目录进行创建,只可对文件创建;删除一个硬链接文件并不影响其他有相同 inode 号的文件。示例:[root@moli_linux1 ~]$ ln /test/hello.txt /tmp/hi.txt #创建文件硬链接[root@moli_linux1 ~]$ rm /test/hello.txt #删除源文件后依旧可用先这样吧。如果错误,请指正,谢谢。溜了溜了,玩会游戏去了。2019-3-6 ...

March 7, 2019 · 3 min · jiezi

详细整理5款较为常用的Linux VPS服务器WEB一键安装工具

早年我们如果在Linux服务器配置网站环境的时候一般如何操作的?安装cPanel面板?这个是要花钱的,记忆中好像每个月需要十多美元,对于普通的个人站长用户来说确实是不小的费用。即便我们用破解版也不行,因为这个牵扯到安全问题。那我们学着一些教程手工编译WEB环境,安装PHP、安装MYSQL、安装APACHE…,是不是很麻烦?更为主要的是,一般我们新人或者国内站长对于LINUX系统并不是特别熟悉,我们可能多一些熟悉WINDOWS系统,因为我们每天都在使用。有什么办法来解决这个问题呢?毕竟随着项目的需求,虚拟主机可能不够用,必须用到服务器。如今我们可以看到很多个人或者第三方提供一键WEB环境脚本,比如熟悉的有LNMP、LAMP、LAMPA等等。在这里,笔者将会在今天整理和分享我们常用的LINUX服务器中配置WEB环境的方法,不用自己编译这么复杂,我们直接可以利用工具自带的一键安装,无人值守。最后根据脚本方提供的小工具建站和管理,是不是很不错?这里我依次整理。第一、LNMP(www.lnmp.org)个人记忆中这款工具至今估计有十年左右时间,当初也是个人站长为方便自己使用WEB环境配置开发的。完全是免费的,每年都有较大的更新和升级。这也是笔者一直在使用的WEB脚本工具之一。LNMP一键安装包是一个用Linux Shell编写的可以为CentOS/RHEL/Fedora/Aliyun/Amazon、Debian/Ubuntu/Raspbian/Deepin/Mint Linux VPS或独立主机安装LNMP(Nginx/MySQL/PHP)、LNMPA(Nginx/MySQL/PHP/Apache)、LAMP(Apache/MySQL/PHP)生产环境的Shell程序。1、安装wget http://soft.vpser.net/lnmp/lnmp1.5.tar.gz -cO lnmp1.5.tar.gz &&tar zxf lnmp1.5.tar.gz && cd lnmp1.5 && ./install.sh lnmp这个脚本支持大部分LINUX版本,比如CENTOS、DEBIAN、UBUNTU等。个人建议内存配置在1G以及以上,因为MYSQL5.6以上需要至少1GB内存。2、应用在安装完毕之后,我们可以根据官方提供的脚本工具方法进行建站、管理等操作。a. lnmp添加、删除虚拟主机及伪静态管理b. 使用lnmp自带工具快速添加网站/域名绑定目录c. 一键安装无面板LNMP WEB建站环境这个脚本每年6月1日会有较大版本更新。如果我们有需要升级可以根据官方提供的方法升级或者安装新版本。第二、LAMP(lamp.sh)LAMP一键脚本也是由于个人站长提供的,经过几年的改善目前也是比较完善。LAMP 一键安装包是一个用 Linux Shell 编写的可以为 Amazon Linux/CentOS/Fedora/Debian/Ubuntu 系统的 VPS 或服务器安装 LAMP(Linux + Apache + MySQL/MariaDB/Percona + PHP) 生产环境的 Shell 脚本。包含一些可选安装组件如:Zend OPcache, ionCube Loader, XCache, imagick, gmagick, libsodium, memcached, redis, mongodb, swoole, yaf, xdebug。1、安装yum -y install wget screen gitgit clone https://github.com/teddysun/lamp.gitcd lampchmod 755 *.shscreen -S lamp~/lamp/lamp.sh -h根据提示进行安装。2、应用a. LAMP常见应用问题第三、Oneinstack(oneinstack.com)Oneinstack脚本至今应该有两三年时间,笔者也经常和作者聊天关于脚本的进度和问题反馈。看似这个脚本工具在LNMP基础上改善的,但是其特点在于不断的升级,而且是第一时间升级。目前软件版本都是保持最新。1、安装yum -y install wget screen #for CentOS/Redhat# apt-get -y install wget screen #for Debian/Ubuntuwget http://mirrors.linuxeye.com/oneinstack-full.tar.gz #包含源码,国内外均可下载tar xzf oneinstack-full.tar.gzcd oneinstack #如果需要修改目录(安装、数据存储、Nginx日志),请修改options.conf文件screen -S oneinstack #如果网路出现中断,可以执行命令screen -R oneinstack重新连接安装窗口./install.sh然后根据提示向导进行安装。2、应用a. oneinstack自动模式使用教程b. Oneinstack环境快速部署Let’s Encrypt泛域名SSL证书第四、WDCP面板(wdcp.net)WDCP是可视化面板,与上面三个脚本不同之处在于安装之后可以看到安装软件界面。类似我们用的cpanel面板一样。因为不是所有的站长都会用SHELL脚本命令的。但是这个脚本缺点是这几年更新很慢,而且易用性不如以前了。前几天看居然还开始收费。1、安装wget http://dl.wdlinux.cn/files/lanmp_v3.3.tar.gztar zxvf lanmp_v3.3.tar.gzsh lanmp.sh2、应用a. 利用WDCP面板建站篇 - 添加站点和MYSQL数据库b. WDCP面板基于PHP5.5.38安装swoole扩展支持目前,WDCP也开始收费服务,如果我们有更好的选择,可以用其他免费的。第五、宝塔面板(bt.cn)宝塔面板其实就是在WDCP面板不维护的时候开发的,迎合用户的需求起步。根据官方的额说法是永久免费,但是如今也开始收费。不过免费版本基础功能还是可以用的,只不过一些安全扩展和应用付费。至少到目前为止还可以使用。1、安装yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && bash install.sh建议使用CENTOS7.X,其他兼容不好。2、应用a. 宝塔面板安装后需要多的几件事情b. 宝塔linux面板安装使用教程汇总贴从目前看,如果是可视化面板应用的话还是这款有优势。如果以后这款没有优势,我们再寻找是否有其他可替代品。总结,通过上面3款无面板的脚本安装,以及2款有面板的WEB环境。我们基本上可以掌握在服务器中配置WEB。具体选择哪款还是根据自己的习惯。 ...

March 6, 2019 · 1 min · jiezi

Linux系统服务管理

环境:CentOS Linux release 7.5.1804 (Core)chkconfigchkconfig命令主要用来更新(启动或停止)和查询系统服务的运行级信息。参数用法:–add增加所指定的系统服务,让chkconfig指令得以管理它,并同时在系统启动的叙述文件内增加相关数据。–del 删除所指定的系统服务,不再由chkconfig指令管理,并同时在系统启动的叙述文内删除相关数据。–level<等级代号> 指定读系统服务要在哪一个执行等级中开启或关毕。等级0表示:表示关机等级1表示:单用户模式等级2表示:无网络连接的多用户命令行模式等级3表示:有网络连接的多用户命令行模式等级4表示:不可用等级5表示:带图形界面的多用户模式等级6表示:重新启动示例:chkconfig –list显示所有运行级系统服务的运行状态信息(on或off)。如果指定了name,那么只显示指定的服务在不同运行级的状态,如(chkconfig –list nginx)。[root@moli_linux1 ~]$ chkconfig –list注:该输出结果只显示 SysV 服务,并不包含原生 systemd 服务。SysV 配置数据可能被原生 systemd 配置覆盖。 要列出 systemd 服务,请执行 ‘systemctl list-unit-files’。 查看在具体 target 启用的服务请执行 ‘systemctl list-dependencies [target]’。mysqld 0:关 1:关 2:开 3:开 4:开 5:开 6:关netconsole 0:关 1:关 2:关 3:关 4:关 5:关 6:关network 0:关 1:关 2:开 3:开 4:开 5:开 6:关nginx 0:关 1:关 2:开 3:开 4:开 5:开 6:关php-fpm 0:关 1:关 2:开 3:开 4:开 5:开 6:关示例2:将network服务3级别停止掉$ chkconfig –level 3 network off示例3:将network服务345级别停止掉$ chkconfig –level 345 network off示例4:将network服务从启动列表删除$ chkconfig –del network示例5:将network服务加入到开机启动列表$ chkconfig –add network将一个服务或者脚本加入开机启动列表,需要将这个服务的启动文件(shell脚本)放入/etc/init.d目录下,而且启动文件中需要有# chkconfig:2342 74 83和# description:xxx这样格式的存在。如:systemdCentOS7中使用systemd替换了SysV。Systemd目的是要取代Unix时代以来一直在使用的init系统,兼容SysV和LSB的启动脚本,而且够在进程启动过程中更有效地引导加载服务。如果是通过RPM或者YUM安装,则应用程序一般在/usr/lib/systemd/system目录下创建对应的配置文件,我们可以通过系统提供的systemctl命令来管理这些服务。systemd的特性有:支持并行化任务同时采用socket式与D-Bus总线式激活服务;按需启动守护进程(daemon);利用 Linux 的 cgroups 监视进程;支持快照和系统恢复;维护挂载点和自动挂载点;各服务间基于依赖关系进行精密控制。systemctl命令检视和控制systemd的主要命令是systemctl。该命令可用于查看系统状态和管理系统及服务。1. 查看系统中所有服务$ systemctl list-units –all –type=service2. 让服务开机启动(以crond服务为例)$ systemctl enable crond.service3. 不让服务开机启动$ systemctl disable crond 4. 查看状态$ systemctl status crond 如图,crond服务正在启动状态 5. 停止服务$ systemctl stop crond 6. 启动服务$ systemctl start crond 7. 重启服务$ systemctl restart crond 8. 检查服务是否开机启动$ systemctl is-enabled crond enabled表示开机启动,disabled表示开机不启动 注意:设置一个服务开机启动或者开机不启动的时候,会有一个提示,例如,设置crond服务开机启动或者不启动,都会有一行提示如下:# 设置开机自启$ systemctl enable crondCreated symlink from /etc/systemd/system/multi-user.target.wants/crond.service to /usr/lib/systemd/system/crond.service.# 设置开机不自启$ systemctl disable crondRemoved symlink /etc/systemd/system/multi-user.target.wants/crond.service. 当enable一个服务时,就会创建一条软连接,而disable的时候就会挪走这个软连接。 ...

March 5, 2019 · 1 min · jiezi

Linux中用户管理

账户和组用户和组的简介Linux系统对账号与组的管理是通过ID号来实现的。用户ID号叫UID,组ID号叫GID。其中:UID=0是超级管理员,也就是root账号UID=1~499被系统所预留个人创建的用户的UID会从500开始算起Linux操作系统中的组分为基本组和附加组,一个用户同一时刻只能加入同一个基本组,但可以同时加入多个附加组。默认在创建用户时,系统会自动创建同名的组,并设置用户加入该组。查看用户ID的命令是:id 用法:id 用户名创建用户和组创建用户命令:useradd常用选项:-c 设置账号描述信息,一般为账号全称-d 设置用户家目录,默认/home/用户名-g 设置账户基本组-G 设置账户附加组,多个附加组之间用逗号隔开-s 设置账户登录Shell,默认为bash-M 不创建用户家目录,一般与-s连用-u 指定账号UID示例1:创建普通用户mori,以及对应的组$ useradd mori$ id moriuid=1003(mori) gid=1003(mori) 组=1003(mori)示例2:创建普通用户syushin,账户家目录为/home/syushin,账户基本组为root,附加组为mori$ useradd -d /home/syushin -g root -G mori syushin$ id syushinuid=1004(syushin) gid=0(root) 组=0(root),1003(mori)示例3:创建无法登录系统,且没有家目录的用户user1$ useradd -s /sbin/nologin -M user1创建组命令:groupadd选项:-g 设置组ID号示例:$ groupadd laowan #创建组laowan$ groupadd -g 2000 xiaoming #创建xiaoming组,组ID为2000的修改用户和组修改用户密码命令:passwd常用选项:-l 锁定账户,仅root用户可用–stdin从文件或者管道读取密码-u 解锁账户-d快速清空用户密码,仅root可用示例:$ passwd mori更改用户 mori 的密码 。新的 密码:重新输入新的 密码:passwd:所有的身份验证令牌已经成功更新。$ echo “1234qwer” | passwd –stdin mori #通过管道指定用户mori的密码 $ passwd -l mori #锁定用户mori$ passwd -u mori #解锁用户mori修改用户信息命令:usermod选项:-d 修改用户家目录-e 修改用户失效日期-g 修改用户所属基本组-G 修改用户所属附加组-s 修改用户登录shell-u 修改用户UID示例:$ usermod -d /home/harucha haru$ usermod -e 2019-2-28 haru # 设置haru用户失效日期为2019-2-28$ usermod -g root haru$ usermod -s /bin/bash haru $ usermod -u 1314 haru #修改haru用户的ID为1314删除用户和组删除用户命令:userdel选项:-r 删除账户及相关文件示例:$ userdel mori$ userdel -r syushin # 删除组syushin,并删除/home下的syushin目录删除组命令:groupdel示例:groupdel mori与用户相关的配置文件$ ll /etc/passwd /etc/shadow /etc/group /etc//gshadow-rw-r–r–. 1 root root 718 2月 28 14:44 /etc/group———-. 1 root root 573 2月 28 14:44 /etc//gshadow-rw-r–r–. 1 root root 1684 2月 28 14:44 /etc/passwd———-. 1 root root 1081 2月 28 14:55 /etc/shadow/etc/passwd配置文件详解$ head -1 /etc/passwdroot❌0:0:root:/root:/bin/bash # 一一对应的说明如下用户名:密码占位符:账户UID:组GID:附加信息:用户家目录:用户登录的shell常见面试题创建3个用户user1,user2,user3,并设置密码为123456,禁止使用for,while循环。$ echo user{1..3}|xargs -n1 -exec useradd # 创建用户$ echo “123456” | passwd –stdin user1 user2 user3 # 设置密码 ...

February 28, 2019 · 1 min · jiezi

docker笔记2-镜像与容器

docker镜像概述操作系统分为内核kernel和用户空间。对于Linux而言,内核(bootfs)启动后会挂载root文件系统为其提供用户空间支持。而docker镜像,就相当于是一个root文件系统(rootfs)。bootfs:用于系统引导的文件系统,包括bootloader和kernel,容器启动完成后会被卸载以节约内存资源rootfs:位于bootfs之上,表现为docker容器的根文件系统镜像原理镜像的root文件系统被设计为分层存储的架构。镜像在构建时,会一层一层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变只会发生在自己这一层。分层存储的特征使得镜像的复用,定制变得更加容易。可以使用构建好的镜像作为基础层,再进一步的添加新的层,以定制自己所需的内容,构建新的镜像。简单来说,镜像是:文件和metedata的集合(rootfs)镜像是分层存储的,并且每一层都可以添加改变删除文件,成为一个新的镜像不同镜像可以共享相同的layer(层)镜像本身是read-only的镜像获取镜像的获取方式:从镜像仓库(registry)获取通过commit命令将容器保存为镜像通过Dockerfile定制容器(推荐使用)通过rootfs压缩包导入docker save和docker load命令镜像管理从Registry拉取镜像在docker hub上有大量高质量的镜像可以使用,从镜像仓库拉取镜像的命令格式是:docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]镜像的名称格式Docker镜像仓库地址:<域名/IP>[:端口号],默认地址是docker hub仓库名:<用户名>/<软件名>,对于docker hub,如果不给出用户名,默认是library,也就是官方镜像标签:标签一般是镜像的版本信息,不指定标签默认是latest例如:docker pull centos$ docker pull centosUsing default tag: latestlatest: Pulling from library/centosa02a4930cb5d: Pull complete Digest: sha256:184e5f35598e333bfa7de10d8fb1cebb5ee4df5bc0f970bf2b1e7c7345136426Status: Downloaded newer image for centos:latest这条命令没有给出镜像仓库地址,默认从Docker Hub上获取。而镜像名称是centos,因此会获取官方镜像library/centos中标签为latest的镜像配置镜像加速器因为docker hub地址是在国外,从国内拉取镜像仓库中的镜像会比较慢,此时可以配置镜像加速器。目前Docker官方和国内的云服务商都有提供国内加速服务。Docker官方提供的中国加速器阿里云加速器配置阿里云加速器为例:环境说明系统环境:centos7docker版本:Docker version 18.03.0-ce创建目录文件$ mkdir -p /etc/docker$ vim /etc/docker/daemon.json添加配置内容,配置内容在阿里云容器镜像服务中可以获取,每个阿里云账号都有自己的镜像加速器。{ “registry-mirrors”: [“https://这里的配置每个人都有.mirror.aliyuncs.com”]}然后就是重新加载文件和重启docker,就可以了$ systemctl daemon-reload$ systemctl restart docker列出镜像列出本地镜像的命令是:$ docker image ls或者$ docker images删除镜像删除本地镜像的命令:$ docker image rm [选项] <镜像1> [<镜像2> …]镜像可以是镜像短ID,长ID,镜像名或者镜像摘要。下面看$ docker images列出的镜像信息。$ docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEcentos latest 1e1148e4cc2c 2 months ago 202MBbusybox latest 59788edf1f3e 4 months ago 1.15MBdjango-compose_web latest cfd70f0cb009 5 months ago 969MBpostgres latest ac25c2bac3c4 5 months ago 228MBmy-compose_web latest 4867e7c35cc9 5 months ago 86.5MB其中REPOSITORY+TAG称为镜像名,IMAGE ID是镜像ID,取前几位就是镜像短ID。比如用镜像名删除centos镜像:$ docker image rm centos:latestUntagged: centos:latestUntagged: centos@sha256:184e5f35598e333bfa7de10d8fb1cebb5ee4df5bc0f970bf2b1e7c7345136426Deleted: sha256:1e1148e4cc2c148c6890a18e3b2d2dde41a6745ceb4e5fe94a923d811bf82ddbDeleted: sha256:071d8bd765171080d01682844524be57ac9883e53079b6ac66707e192ea25956使用镜像短ID删除镜像:$ docker image rm 59788edUntagged: busybox:latestUntagged: busybox@sha256:2a03a6059f21e150ae84b0973863609494aad70f0a80eaeb64bddd8d92465812Deleted: sha256:59788edf1f3e78cd0ebe6ce1446e9d10788225db3dedcfd1a59f764bad2b2690Deleted: sha256:8a788232037eaf17794408ff3df6b922a1aedf9ef8de36afdae3ed0b0381907b可以看到busybox这个镜像已经被删除。也可以类似管道一样,结合其他命令的结果来删除镜像,比如docker image ls -q,先看看这个命令的执行结果。$ docker image ls -q python449d3495be0e82514113452882514113452840792d8a2d6d这个命令执行返回本地镜像中所有python镜像的镜像ID,有了ID就可以结合docker image rm来删除了。docker image rm $(docker image ls -q)这条命令对想要成批删除镜像很有帮助。给镜像打标签给镜像打标签的命令是docker tag 原镜像 新镜像名:标签,注意,打标签会新生成一个镜像,而且这个新的镜像ID和原镜像一样。注意:镜像的唯一标识是其ID和摘要,一个镜像可以有多个标签。当删除镜像的时候,实际上是删除某个标签的镜像。$ docker tag busybox busybox:version1$ docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEbusybox latest d8233ab899d4 12 days ago 1.2MBbusybox version1 d8233ab899d4 12 days ago 1.2MB启动镜像为容器启动镜像为容器的命令,列举常用的一条命令:docker run -itd (镜像名/ID/镜像摘要)$ docker run -itd busyboxaa6ef78ae7b93704cbf9f99e184c2e2cb53924d693ca67c370fa74f52ff38d15上面示例启动了busybox镜像为容器,不添加标签说明默认启动busybox:latest。选项说明:-i表示让容器的标准输入打开,-t表示分配一个伪终端,-d表示后台启动。要把-i -t -d 放到镜像名字前面。查看运行状态的容器查看容器运行状态使用docker ps只能查看运行中的容器,-a选项查看全部容器,包括未运行的容器。$ docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESaa6ef78ae7b9 busybox “sh” 23 minutes ago Up 23 minutes thirsty_brattainee0034f44bc6 wordpress:latest “docker-entrypoint.s…” 5 months ago Up About an hour 0.0.0.0:8000->80/tcp wordpress-compose_wordpress_1cbcb7baa5b2f mysql:5.7 “docker-entrypoint.s…” 5 months ago Up About an hour 3306/tcp, 33060/tcp wordpress-compose_db_1$ docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESaa6ef78ae7b9 busybox “sh” 23 minutes ago Up 23 minutes thirsty_brattain341ea8ff6424 django-compose_web “python3 manage.py r…” 5 months ago Exited (137) 5 months ago django-compose_web_1bffde084f040 django-compose_web “django-admin.py sta…” 5 months ago Exited (0) 5 months ago django-compose_web_run_10f68cb4ccae0 postgres “docker-entrypoint.s…” 5 months ago Exited (0) 5 months ago django-compose_db_1ee0034f44bc6 wordpress:latest “docker-entrypoint.s…” 5 months ago Up About an hour 0.0.0.0:8000->80/tcp wordpress-compose_wordpress_1使用commit构建镜像镜像是容器的基础,每次执行 docker run 的时候都会指定哪个镜像作为容器运行的基础。镜像是多层存储,每一层是在前一层的基础上进行的修改;而容器同样也是多层存储,是在以镜像为基础层,在其基础上加一层作为容器运行时的存储层。因此,在运行的容器对容器进行添加修改操作,也就是修改容器的存储层,docker提供了commit命令可以将容器存储层保存下来称为镜像。用例子看一下吧:通过压缩包导入创建镜像镜像构建之Dockerfile ...

February 27, 2019 · 2 min · jiezi

[个人笔记] 关于linux的常见问题合集

关于linux的常见问题合集,有技术问题,上 bug200.com如何设置文件夹及其所有子文件夹和文件的chmod?有什么方法可以设置吗chmod 755对于/opt/lampp/htdocs它的所有内容包括子文件夹和文件? 将来,如果我在htdocs,如何将其权限自动设置为755? 此操作有效,但仅适用于此文件夹: chmod 775 /opt/lampp/htdocs如何将包含文件的文件夹复制到UNIX/Linux中的另一个文件夹?我有一些问题要将文件夹中包含文件的文件夹复制到另一个文件夹中。命令cp -r不复制文件夹中的文件。如何根据通配符匹配递归查找当前和子文件夹中的所有文件?如何根据通配符匹配递归查找当前和子文件夹中的所有文件?chmod 777到文件夹和所有内容这个问题已经有了答案: How do I set chmod for a folder and all of its subfolders and files? [closed] 16答如何从终端窗口在Linux中创建文件?在Linux终端中创建文件最简单的方法是什么?如何递归地grep?如何递归grep所有目录和子目录? find . | xargs grep “texthere” 错误:无法找到或加载主类这个问题已经有了答案: What does “Could not find or load main class” mean? 41答如何在Linux/Unix上永久设置$path?我正在尝试向路径中添加一个目录,以便它始终位于我的Linux路径中。我试过了: export PATH=$PATH:/path/to/dir 但是,每次我退出终端并启动一个新的终端实例时,这个路径都会丢失,我需要再次运行export命令。 我该怎么做才能永久设置?循环访问bash中的文件内容如何迭代文本文件的每一行Bash? 使用此脚本: echo “Start!” for p in (peptides.txt) do echo “${p}” done 我在屏幕上得到这个输出: Start! ./runPep.sh: line 3: syntax error near unexpected token (’ ./runPep.sh: line 3: (后来我想做一些更复杂终止分离的屏幕会话我从某个地方学到一个独立的屏幕可以被 screen-x-s[session you want to kill]杀戮 可以从中获取[你想杀死的会话] 屏幕LS . 但这不管用。有什么问题吗?正确的方法是什么?如何在终端中获取当前日期和时间,并在终端中为其设置自定义命令?我必须在Linux终端中检查时间。在Linux终端中,获取日期和时间的命令是什么?有什么方法可以设置自定义函数吗?如何使用ssh从服务器下载文件?我需要从服务器下载一个文件到我的桌面。(Ubuntu10.04)我没有访问服务器的网络,只有ssh。 如果有帮助,我的操作系统是Mac OS X和iTerm 2作为终端。丢失的httpd.conf文件位于apache我怎么能找到我的httpd.conf是否找到文件? 我在AmazonWebServicesEC2(弹性计算云)上运行UbuntuLinux服务器,找不到我的apache配置。睡眠数毫秒我知道这个姿势sleep(x)函数使程序休眠x秒。有使程序休眠x的功能吗毫秒在C++中?如何计算文档中的行数?我有这样的线条,我想知道我有多少线条… 09:16:39 AM all 2.00 0.00 4.00 0.00 0.00 0.00 0.00 0.00 94.00 09:16:40 AM all 5.00 0.00 0.00 4.00 0.00 0.00 0.00 0.00 91.00 09将所有输出重定向到文件这个问题已经有了答案: How can I redirect and append both stdout and stderr to a file with Bash? 6答是否有列出所有Unix组名的命令?我知道有/etc/group列出所有用户组的文件。 我想知道是否有一个简单的命令列出所有用户组名称,尽管解析世界可读/etc/group文件。我愿意创建一个列出Linux帐户组名的管理员网页。加载共享库时发生Linux错误:无法打开共享对象文件:没有此类文件或目录该程序是Xenomai测试套件的一部分,从Linux PC交叉编译到Linux+Xenomai ARM工具链中。 # echo $LD_LIBRARY_PATH删除指向目录的符号链接我有一个重要目录的符号链接。我想去掉这个符号链接,同时把目录放在后面。 我试过rm然后回来rm: cannot remove ‘foo’.我试过rmdir回来了rmdir: failed to remove ‘foo’: Directory not empty然后我通过rm -f,rm -rf和sudo rm -rf 然后我去找我的备份。 有没有一种方法可以摆脱这个符号链接,把婴儿和洗澡水一起扔掉如何在Linux中列出具有绝对路径的文件?[关闭]我想生成具有完整路径的递归文件列表 /home/ken/foo/bar 但据我所知ls和find只提供相对路径列表 ./foo/bar (from the folder ken) 这似乎是一个明显的要求,但我看不到find或ls人页。[http post and get using curl in linux[duplicate]](https://bug200.com/post/14978…这个问题已经有了答案: How to send a header using a HTTP request through a curl call? 7答如何在启动时运行shell脚本在AmazonLinux实例上,我有两个脚本start_my_app和stop_my_app哪个开始和停止forever(反过来运行node.js应用程序)。我使用这些脚本手动启动和停止我的节点应用程序。到现在为止,一直都还不错。 我的问题是:我还想把它设置成start_my_app在系统启动时运行。我知道我需要在里面添加一个文件init.d我知道如何将其符号链接到rc.d但无法确定我放入的文件中如何在不确认的情况下强制CP覆盖我正在尝试使用cp命令并强制覆盖。 我试过了cp -rf /foo/ /bar,但仍然提示我确认每个覆盖。如何排除查找中的目录。命令我在试着运行一个find所有javascript文件的命令,但如何排除特定目录? 这里是find我们使用的代码。 for file in $(find . -name ‘.js’) do java -jar config/yuicompressor-2.4.2.jar –type js $file -o $file done如何删除导出的环境变量?在安装gnuplot之前,我设置了环境变量GNUPLOT_DRIVER_DIR = /home/gnuplot/build/src. 在安装过程中,出了点问题。 我想把GNUPLOT_DRIVER_DIR环境变量。我怎样才能做到?tar目录的shell命令,不包括某些文件/文件夹是否有一个简单的shell命令/脚本支持从存档中排除某些文件/文件夹? 我有一个目录需要用一个子目录归档,该子目录包含许多我不需要备份的非常大的文件。 不完全解决方案: 这个tar –exclude=PATTERN命令匹配给定的模式并排除这些文件,但我需要忽略特定的文件和文件夹(完整的文件路径),否则可能会排除有效的文件。 我也可以使用find命令创建一个文件列表,排除那些我不想归档的文件,并将如何将node.js作为后台进程运行,永不死机?我通过putty ssh连接到Linux服务器。我尝试将其作为后台进程运行,如下所示: $ node server.js & 但是,2.5小时后,终端将变为非活动状态,进程将停止。在终端断开连接的情况下,是否仍可以保持进程的活动状态? 编辑1 实际上,我试过nohup但是,一旦我关闭Putty ssh终端或拔下互联网插头,服务器进程就会立即停止。 我在油灰里有什么事要做吗? 编辑2(如何获取文件的完整路径?有什么简单的方法可以打印file.txt? file.txt = /nfs/an/disks/jj/home/dir/file.txt 这个<command> dir> <command> file.txt 应该打印 /nfs/an/disks/jj/home/dir/file.txtusr/bin/ld:找不到-l<name数据库>我正在编译程序,它返回以下错误: usr/bin/ld: cannot find -l<nameOfTheLibrary> 在makefile中,我使用命令g++以及指向我的库的链接,这是指向位于其他目录上的库的符号链接。 是否可以添加选项以使其正常工作?错误1045(28000):用户&39;根&39;@&39;本地主机&39的访问被拒绝;(使用密码:是)我是一个电气工程师,主要是玩电力系统,而不是编程。最近,我一直在遵循一个手册,在Ubuntu上安装一个软件套件。我不知道mySQL实际上。我已经在我的Ubuntu上完成了以下安装。 sudo apt-get update sudo apt-get install mysql-server-5.5 sudo apt-get install mysql-client-5.5 sudo apt-get如何将stdout和stderr重定向并附加到带有bash的文件中?重定向标准输出对于bash中的截断文件,我知道使用: cmd > file.txt 重定向标准输出在bash中,附加到一个文件后,我知道要使用: cmd >> file.txt 同时重定向标准输出和标准错误对于截断的文件,我知道使用: cmd &> file.txt 我如何重定向两者标准输出和标准错误附加到文件?cmd &>> file.t如何找到mysql my.cnf位置是否有mysql命令来定位my.cnf配置文件,类似于php的phpinfo()其定位php.ini?如何在Linux中设置环境变量ld_library_path我首先执行了命令:export LD_LIBRARY_PATH=/usr/local/lib 然后我打开了.bash_profile文件:vi ~/.bash_profile. 在这个文件中,我把: LD_LIBRARY_PATH=/usr/local/lib export LD_LIBRARY_PATH 然后,如果终端关闭并重新启动,则键入echo $LD_LIBRARY_PATH不显示结果。使用ls列出目录及其总大小可以用吗ls在Unix中,要列出子目录及其所有内容的总大小,而不是通常的4K(我假设)只是目录文件本身?即。 total 12K drwxrwxr-x 6 4.0K 2009-06-19 10:10 branches drwxrwxr-x 13 4.0K 2009-06-19 10:52 tags drwxrwxr-x 16 4.0K 2009-0ld找不到现有库我正试图将一个应用程序与这个Debian-Lenny系统上的G++链接起来。ld抱怨找不到指定的库。这里的具体示例是ImageMagick,但我也遇到了一些其他库的类似问题。 我打电话给链接器是: g++ -w (..lots of .o files/include directories/etc..) -L/usr/lib -lmagic LD抱怨: /usr/bin/ld: cannot将多个PDF文件合并/转换为一个PDF如何将多个PDF文件合并/转换为一个大的PDF文件? 我尝试了以下操作,但目标文件的内容与预期不符: convert file1.pdf file2.pdf merged.pdf 我需要一个非常简单/基本的命令行(cli)解决方案。最好是我可以将合并/转换的输出直接传输到pdf2ps(正如我之前在这里提出的问题中最初尝试的那样:Linux piping ( convert -> pdf2p如何在Linux中为所有用户设置java_home我是新的Linux系统,似乎有太多的Java文件夹。 Java版本给了我: Java版本“1.7.0y55” OpenJDK运行时环境(rhel-2.4.7.1.el6_5-x86_64 u55-b13) openjdk 64位服务器vm(构建24.51-b03,混合模式) 当我试图构建一个Maven项目时,我得到了一个错误: Error: JAVA_HOME is not defined c如何修复&39;sudo:不存在tty,并且没有指定askpass程序&39;错误?我正在尝试使用makefile编译一些源文件。在makefile中有一组命令需要作为sudo. 当我从一个终端编译源代码时,一切都正常,并且在第一次sudo正在运行等待密码的命令。输入密码后,恢复并完成。 但是我希望能够用netbeans编译源代码。因此,我启动了一个项目,并向netbeans展示了在哪里找到源代码,但是当我编译项目时,它给出了错误: sudo: no tty present an如何测试一个变量是否是bash中的数字?我只是不知道如何确定传递给脚本的参数是否是数字。 我只想做这样的事情: test isnumber $1 &amp;&amp; VAR=$1 || echo “need a number” 有什么帮助吗?如何确定给定的Linux是32位还是64位?当我打字时uname -a,它提供以下输出。 Linux mars 2.6.9-67.0.15.ELsmp #1 SMP Tue Apr 22 13:50:33 EDT 2008 i686 i686 i386 GNU/Linux 我怎么知道给定的操作系统是32位还是64位? 这在写作时很有用configure脚本,例如:我构建什么架构?为什么“cd”不能在shell脚本中工作?我正在尝试编写一个小脚本,将当前目录更改为我的项目目录: #!/bin/bash cd /home/tree/projects/java 我将此文件保存为proj,并添加了执行权限chmod,并将其复制到/usr/bin. 当我打电话给它时:proj它什么也不做。我做错什么了?你为什么要放!/脚本文件开头的bin/bash?我已经做了Bash以前的脚本和它们在开始时都没有运行良好。把它放进去有什么意义?事情会有什么不同吗? 另外,你怎么发音#?我知道!发音为“bang”。 如何#!明显的?如何将密码传递给SCP?我知道不建议这样做,但是否可以将用户的密码传递给SCP? 我想通过SCP复制一个文件作为批处理作业的一部分,而接收服务器当然需要密码,不,我不能轻易地将其更改为基于密钥的身份验证。如何登录mysql,从linux终端查询数据库我使用的是DebianLinux。 我有一台安装mysql的Linux机器。 我可以使用根用户和其他用户登录到我的Linux机器。 我可以使用sqlyog从Windows机器连接到Linux机器上的mysql数据库。 现在我只想使用Linux终端在Linux机器上执行查询 我在候机楼做了以下几件事 我转到根目录,然后转到/var/lib目录 我在终端上运行以下命令 mysqladmin -u ro在Linux中未定义对pthread_create的引用我从网上下载了以下演示https://computing.llnl.gov/tu… #include <pthread.h> #include <stdio.h> #define NUM_THREADS 5 void PrintHello(void threadid) { long tid; tid = (long)使用openssl从服务器获取证书我正在尝试获取远程服务器的证书,然后我可以使用它来添加到我的密钥库中,并在我的Java应用程序中使用。 一位高级开发人员(节假日:()告诉我我可以运行这个: openssl s_client -connect host.host:9999 得到一个原始证书,然后我可以复制和导出。我收到以下输出: depth=1 /C=NZ/ST=Test State or Province/O=Organiza如何查看按实际内存使用情况排序的顶级进程?我有一台有12G内存的服务器。顶部的碎片如下所示: PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND递归计算Linux目录中的文件数如何递归计算Linux目录中的文件? 我发现这一点: find DIR_NAME -type f ¦ wc -l 但当我运行它时,它返回以下错误。 find:路径必须在表达式之前:?unicodedecode错误:&39;utf8&39;codec可以&39;t解码字节0x9c我有一个套接字服务器,它应该从客户机接收UTF-8有效字符。 问题是有些客户机(主要是黑客)通过它发送所有错误的数据。 我可以很容易地分辨出真正的客户机,但我将记录所有发送的数据,以便稍后分析。 有时我会有这样的角色œ这导致UnicodeDecodeError错误。 我需要能够使字符串utf-8带有或不带有这些字符。 更新: 对于我的特殊情况,套接字服务是MTA,因此我只希望接收如下ASCII命如何将输出重定向到文件和stdout在巴什,打电话foo将在stdout上显示该命令的任何输出。 打电话foo > output将该命令中的任何输出重定向到指定的文件(在本例中为“output”)。 有没有方法将输出重定向到文件和它在stdout上显示了吗?[在Linux中更改默认shell[关闭]](https://bug200.com/post/13046…如何更改默认shell?这个env命令当前显示: SHELL=/bin/tcsh 我想把它改成bash。如何更改Linux中打开文件的数量限制?[关闭]在运行我的应用程序时,我有时会得到一个关于too many files open. 运行ulimit -a报告限制为1024。如何将限制提高到1024以上? 编辑 ulimit -n 2048导致权限错误。检查Ubuntu上是否正在运行特定的服务我不知道服务的名称,但希望通过检查服务的状态来停止服务。例如,如果我想检查PostgreSQL服务是否正在运行,但我不知道服务的名称,那么如何检查其状态? 如果知道服务名,我知道检查状态的命令。如何将终端连接到Ubuntu 10.10(Maverick Meerkat)上的串行到USB设备?我正在尝试将minicom连接到通过USB到串行适配器连接的串行设备。这是一个PL2303,从我所读到的所有内容来看,不需要额外的驱动程序。该设备被识别为PL2303。 我是Minicom的初学者。这是要执行的正确命令吗?或者我需要配置什么? $ sudo minicom –device /dev/ttyUSB0 minicom: cannot open /dev/ttyUSB0: No sucgrep,但仅限于某些文件扩展名我正在写一些剧本给grep某些目录,但这些目录包含各种文件类型。 我想grep只是.h和.cpp现在,但将来可能会有其他一些。 到目前为止,我有: { grep -r -i CP_Image ~/path1/; grep -r -i CP_Image ~/path2/; grep -r -i CP_Image ~/path3/; grep -r -i CP_Image /path4/;查找连接到Linux计算机的所有存储设备[关闭]我需要找到所有与给定机器相连的可写存储设备,不论是否它们是安装的。 做这件事的愚蠢方法是尝试每个条目/dev对应于可写设备(hd and sd…… 有更好的解决方案吗,还是我应该坚持这个?参数列表对于rm、cp、mv命令太长错误我在Unix的一个目录下有几百个pdf。PDF的名称非常长(大约60个字符)。 当我尝试使用以下命令一起删除所有pdf时: rm -f *.pdf 我得到以下错误: /bin/rm: cannot execute [Argument list too long] 这个错误的解决方案是什么? 发生此错误的原因是mv和cp还有命令吗?如果是,如何解决这些命令?chmod递归我有一个归档文件,它是由其他人归档的,我想在下载后自动更改提取文件中文件系统的一个分支以获得读取权限。(我无法更改存档的创建方式)。 我研究过这条线:chmod: How to recursively add execute permissions only to files which already have execute permission像其他人一样,但没有快乐。 目录最初带有多个但所如何设置wget的代理?我想下载一些wget使用代理: HTTP Proxy: 127.0.0.1 Port: 8080 代理不需要用户名和密码。 我该怎么做?我查了很多网站和很多建议,但没有什么对我有用…/configure:/bin/sh^m:错误的解释程序[重复]这个问题已经有了答案: Are shell scripts sensitive to encoding and line endings? 2答为python安装tkinter我正在尝试导入tkinter。但是,我收到一个错误,说明尚未安装tkinter: 导入错误:没有名为_tkinter的模块,请安装python tk包 我可以使用Synaptic Manager安装它(可以吗?)但是,我必须在我编程的每台机器上安装它。是否可以将tkinter库添加到我的工作区并从那里引用它?在Ubuntu[关闭]中创建目录的符号链接下面是我创建目录符号链接的代码: sudo ln -s /usr/local/nginx/conf/ /etc/nginx 我已经创建了目录/etc/nginx. 我只想要源目录的内容(/usr/local/nginx/conf/)位于目标目录的内容中(/etc/nginx)但当我执行代码时,/etc/nginx包含一个名为conf,而不是conf. 那个目录包含我想要的内容,但位置不对。 为如何在Linux上通过ftp递归下载文件夹[关闭]我正在尝试使用命令行ftp客户机对文件夹进行ftp,但到目前为止,我只能使用“get”来获取单个文件。在一行中执行合并多个Linux命令我尝试在一行中合并多个Linux命令来执行部署操作。 例如 cd /my_folder rm *.jar svn co path to repo mvn compile package install提取bash中没有路径和扩展名的文件basename[重复]这个问题已经有了答案: Extract filename and extension in Bash 36答如何在Linux中添加gcc的默认include路径?我希望GCC包括来自$HOME/include除了通常的include目录外,似乎没有类似于$LD_LIBRARY_PATH. 我知道我可以在编译时(或在makefile中)在命令行中添加include目录,但是我真的希望这里有一个通用的方法,就像在库中一样。有效测试Linux上的端口是否打开(无nmap或netcat)从bash脚本中,我如何快速发现端口445在服务器上打开/侦听。 我尝试过几种选择,但我想要一些快速的方法:1。lsof -i :445(以秒为单位)2。netstat -an |grep 445 |grep LISTEN(以秒为单位)三。telnet(它不返回)4。nmap,netcat在服务器上不可用 很高兴知道一种不先枚举然后再枚举greps的方法。如何从命令行获取Linux中的CPU/内核数量?我有这个脚本,但我不知道如何获取打印输出中的最后一个元素: cat /proc/cpuinfo | awk ‘/^processor/{print $3}’ 最后一个元素应该是CPU的数量,减去1。给定两个目录树,我如何才能找出哪些文件不同?如果我想找出两个目录树之间的区别,我通常只执行: diff -r dir1/ dir2/ 这将精确输出相应文件之间的差异。我只想得到内容不同的相应文件的列表。我认为这只是将命令行选项传递给diff但是我在主页上找不到任何东西。 有什么建议吗?更改Linux中VNC会话的分辨率[关闭]我使用VNC连接到工作中的Linux工作站。在工作中,我有一个20英寸的显示器,它以1600x1200的速度运行,而在家里,我使用的是分辨率为1440x900的笔记本电脑。 如果我将vncserver设置为1440x900,我会错过监视器上的大量空间,而如果将它设置为1600x1200,它就不适合笔记本电脑的屏幕,我必须一直滚动它。 有没有什么好方法可以动态调整VNC会话的大小? 我的VNC服务器使用Linux命令行卸载node.js?如何在Linux中使用命令行卸载node.js?如何免费使用inode?我有一个磁盘驱动器,其中inode的使用率为100%(使用df -i命令)。 但是,在大量删除文件之后,使用率仍然是100%。 那么,正确的方法是什么? 使用较少磁盘空间的磁盘驱动器如何可能 与磁盘空间使用率较高的磁盘驱动器相比,inode使用率更高? 如果压缩大量文件,是否可以减少使用的inode计数?从Linux上的epoch开始获取当前时间(秒),bash我需要一些简单的东西date,但从1970年起以秒为单位,而不是当前日期、小时、分钟和秒。 date似乎没有提供这种选择。有简单的方法吗?我在哪里可以找到Linux中的Java SDK?我使用apt-get-install安装了JDK。我不知道我的JDK文件夹在哪里。我需要为它设置路径。有人知道地点吗?move_uploaded_file gives&ldquo;failed to open stream:permission denied&rdquo;error after all configurations I do当我试图在CentOS上用Apache2.2和php 5.3配置upload目录时,总是会遇到这个错误。 在PHP.ini中: upload_tmp_dir = /var/www/html/mysite/tmp_file_upload/ 在HTTPD.CONF: Directory /var/www/html/mysite/tmp_file_upload/> Options -I如何让cp命令创建将文件复制到目标的任何必要文件夹[重复]这个问题已经有了答案: Linux: copy and create destination dir if it does not exist 16答用脚本自动输入ssh密码我需要创建一个脚本,自动向OpenSSH输入密码ssh客户端。 假设我需要myname@somehost使用密码a1234b. 我已经试过了… #/bin/myssh.sh ssh myname@somehost a1234b …但这不起作用。 如何将此功能写入脚本?递归查找具有特定扩展名的文件我正在尝试使用我的bash(最新的UbuntuLTS版本)在目录及其子目录中查找具有特定扩展名的所有文件。 这是在脚本文件中写入的内容: #!/bin/bash directory="/home/flip/Desktop" suffix=“in” browsefolders () for i in “$1”/; do echo “dir :$directory” e[Linux/CentOS PC上的php.ini文件在哪里?[复制品]](https://bug200.com/post/17850…这个问题已经有了答案: Dude, where’s my php.ini? 12答需要一个好的Linux十六进制编辑器[关闭]我需要一个好的Linux十六进制编辑器,我的意思是: 快的 搜索/替换功能 不仅可以显示十六进制的数据,还可以显示二进制、八进制等。 可以处理大型(>1 GB)文件,而不会变得缓慢和无响应(这一要求很重要) 可选,具有一些比较/差异功能 你能提出什么建议?在bash脚本中通过管道与剪贴板连接是否可以在bash中通过管道与剪贴板进行连接? 无论是通过管道连接到设备手柄还是使用辅助应用程序,我都找不到任何东西。 例如,如果/dev/clip是一个链接到剪贴板的设备,我们可以做到: cat /dev/clip # Dump the contents of the clipboard cat foo > /dev/clip # Dump the contents of如何按名称而不是PID终止进程?例如,有时当我试图启动Firefox时,它会说一个Firefox进程已经在运行。所以我必须这样做: jeremy@jeremy-desktop:$ ps aux | grep firefox jeremy 7451 25.0 27.4 170536 65680 ? Sl 22:39 1:18 /usr/lib/firefox-3.0.1/firefox jeremy如何在Windows命令行中查找mysql数据目录在Linux中,我可以使用命令找到mysql安装目录which mysql. 但我在窗户里找不到。我试过echo %path%它产生了许多路径以及通向mysql-bin的路径。 我想在Windows的命令行中找到mysql数据目录,以便在批处理程序中使用。我还想从Linux命令行中找到mysql数据目录。有可能吗?或者我们怎么做? 在我的例子中,mysql数据目录位于安装文件夹,即..MYSQL如何测试mysql在哪个端口上运行,是否可以连接?我安装了MySQL,甚至以用户身份登录。 但当我尝试这样连接时: http://localhost:3306 mysql://localhost:3306 两者都不起作用。不确定这两个是否都可以工作,但至少其中一个应该工作:) 我怎样才能确定港口确实是3306?有没有Linux命令可以看到它? 还有,有没有更正确的方法来尝试通过一个URL?使用sed删除空行我尝试使用sed删除空行: sed ‘/^$/d’ 但我没有运气。 例如,我有以下几行: xxxxxx yyyyyy zzzzzz 我希望它是这样的: xxxxxx yyyyyy zzzzzz 这个的代码应该是什么?如何在bash脚本中将dos/windows换行(crlf)转换为unix换行(lf)?如何以编程方式(即,不使用vi)将DOS/Windows换行符转换为Unix? 这个dos2unix和unix2dos命令在某些系统上不可用。我如何用如下命令来模拟这些sed/awk/tr?“无x11显示变量”是什么意思?我试图在我的Linux机器上安装一个Java应用程序(SLAKWORKS)。 我收到以下错误,我不理解。 你能告诉我怎么处理这个问题吗?谢谢您。 这是我得到的:(我看到一些X11显示器变量需要设置,但是我应该给它什么值以及如何设置?) $ java -jar gate-5.0-beta1-build3048-installer.jar - ERROR - java.awt.HeadlessEx用另一个字符替换字符串中的某些字符我有一根绳子 AxxBCyyyDEFzzLMN 我想全部换掉x和y和z具有_所以输出是 A_BC_DEF_LMN 如何做到这一点? 我知道一系列 echo “$string” | tr ‘x’ ‘’ | tr ‘y’ ‘’ 可以,但我想一次完成,不使用管道。 编辑:以下工作 echo “$string” | tr ‘[xyz]’ ‘_‘卸载繁忙设备我有一些Samba驱动器每天都有多个用户访问。我已经有了代码来识别共享驱动器(从SQL表中),并将它们装载到一个特殊目录中,所有用户都可以在其中访问它们。 我想知道,如果我从我的SQL表中删除一个驱动器(实际上使其脱机),有什么方法可以卸载一个繁忙的设备?到目前为止,我发现任何形式的umount都不起作用。 忽略破坏数据的可能性-是否可以卸载当前正在读取的设备?Linux递归地列出一个目录中的所有文件,包括symlink目录中的文件假设我有一个目录/dir其中有3个指向其他目录的符号链接/dir/dir11,/dir/dir12和/dir/dir13. 我想列出所有文件dir包括里面的那些dir11,dir12和dir13. 为了更通用,我想列出所有文件,包括目录中的符号链接文件。find .,ls -R等在符号链接处停止,而不导航到它们以进一步列出。如何使RPM自动安装依赖项我已经建立了两个转速包 proj1-1.0-1.x86_64.rpm libtest1-1.0-1.x86_64.rpm proj1取决于文件libtest1.so存在并正确反映在RPM包中,如下所示: user@my-pc:$ rpm -qp –requires proj1-1.0-1.x86_64.rpm libtest1.so()(64bit) user@my-pc:$ rpm[如何在Linuxshell脚本中插入新行?[复制品]](https://bug200.com/post/20536…这个问题已经有了答案: Echo newline in Bash prints literal n 17答如何在Linux[关闭]上获得总体CPU SAGE(例如57%)。例如,我想知道如何使用bash获得系统CPU使用率并以百分比表示。 样品输出: 57% 如果有多个核心,最好能计算出平均百分比。增加Linux中TCP/IP连接的最大数量我正在为一台服务器编程,我的连接数量似乎受到限制,因为我的带宽没有饱和,即使我将连接数量设置为“无限制”。 如何增加或消除Ubuntu Linux设备一次可以打开的最大连接数?操作系统是否限制了这一点,还是路由器或ISP?还是别的什么?在shell中获取程序执行时间我想在Linux shell中在几个不同的条件下执行一些东西,并且能够输出每次执行的执行时间。 我知道我可以编写一个Perl或python脚本来完成这个任务,但是有没有一种方法可以在shell中完成呢?(恰巧是巴什)如何使用gdb分析程序的核心转储文件?我的程序操作如下: exe -p param1 -i param2 -o param3 它崩溃并生成了一个核心转储文件core.pid 我想分析核心转储文件 gdb ./exe -p param1 -i param2 -o param3 core.pid 但是gdb识别exe作为GDB的输入。 在这种情况下,如何分析核心转储文件?如何知道bash脚本中的脚本文件名?如何确定脚本本身中bash脚本文件的名称? 就像我的脚本在文件中一样runme.sh,那么如何才能在不进行硬编码的情况下显示“You are running runme.sh”消息?如何在Linux命令行中替换多个文件中的字符串我需要将文件夹中许多文件中的字符串替换为ssh访问服务器。我该怎么做?在Linux系统上快速创建一个大文件我怎么能迅速地在Linux上创建大文件(Red Hat Linux系统? dd会做这项工作,但从/dev/zero当您需要一个大小为数百Gbs的文件进行测试时,写入驱动器可能需要很长时间…如果你需要反复这样做,时间就会积少成多。 我不关心文件的内容,我只是希望它能快速创建。怎么能做到? 使用稀疏文件不适用于此。我需要分配磁盘空间的文件。如何列出正在运行的屏幕会话?我有一堆服务器,在上面我用screen. 程序如下: ssh服务器XXX 发射screen 在几个选项卡中开始实验 分离screen 断开与服务器的连接 当实验运行时,我可以很容易地找到它们所使用的服务器ssh转到所有服务器并列出正在运行的进程(使用top或ps) 然而,一旦实验完成,我怎么能找到在哪些服务器上打开了一个屏幕会话(以便我可以查看输出,重新启动它们等)? PS:我的实验也会把它们 ...

February 22, 2019 · 4 min · jiezi

记一次server CPU飙升+大量stat系统调用的解决方案

背景:发现app server在测试机经常CPU飙升到接近100%strace发现大量的stat系统调用:[root@app02 ~]# strace -p 2205 -C…stat("/home/ouyang/storyapi/xb_handlers/support/system/get_pop_ups_handler.py", {st_mode=S_IFREG|0644, st_size=4094, …}) = 0stat("/home/ouyang/storyapi/xb_dao/support/share/base/user_share_newpull_dao.py", {st_mode=S_IFREG|0644, st_size=3695, …}) = 0stat("/usr/lib/python2.7/site-packages/urllib3/exceptions.py", {st_mode=S_IFREG|0644, st_size=6603, …}) = 0stat("/home/ouyang/storyapi/xb_dao/pay/comic/record/init.py", {st_mode=S_IFREG|0644, st_size=0, …}) = 0stat("/usr/lib/python2.7/site-packages/urllib3/packages/init.py", ^Cstrace: Process 6134 detached <detached …>% time seconds usecs/call calls errors syscall —- ———– ———– ——— ——— —————-▽96.53 20.122361 17332 1161 252 futex 2.95 0.614242 2 328764 477 stat 0.35 0.073086 163 448 read 0.06 0.013246 166 80 select 0.04 0.008513 5 1721 1388 open 0.02 0.004120 2 1780 getdents 0.01 0.002841 5 531 fstat 0.01 0.002252 3 890 openat 0.01 0.001959 2 1226 close 0.01 0.001300 1 883 lstat 0.01 0.001283 7 174 munmap 0.00 0.000485 3 191 mmap 0.00 0.000161 3 51 lseek 0.00 0.000080 2 34 brk 0.00 0.000039 39 1 clone 0.00 0.000014 3 5 mprotect 0.00 0.000005 1 5 5 ioctl 0.00 0.000000 0 6 6 access 0.00 0.000000 0 12 fcntl—— ———– ———– ——— ——— —————-100.00 20.845987 337963 2128 total[root@app02 ~]# 分析:1、业务代码并没有很多针对文件相关的操作。2、看stat系统调用各个代码文件都有涉及到,怀疑是django的reload模块导致。尝试:启动服务器时增加–noreload选项[root@app02 ~]# cat /etc/supervisord.d/app.ini [program:app]user=rootenvironment= PATH="/usr/bin"directory=/home/ouyang/storyapicommand=python manage.py runserver 0.0.0.0:8002 –nothreading –noreloadredirect_stderr=truestdout_logfile=/home/ouyang/storyapi/log/super.logstderr_logfile=/home/ouyang/storyapi/log/super.errstartsecs=1stopwaitsecs=1stopasgroup=true结果:1、问题解决,没有大量的stat系统调用了;2、CPU稳定在1%。 ...

February 18, 2019 · 1 min · jiezi

CentOS7简单部署NFS

环境准备: - CentOS7 - ip 192.168.88.91(服务端) - 192.168.88.93(客户端)由于nfs的正常运行需要关联rpc服务,需要先检查机器上是否安装了相关服务rpm -aq rpcbind nfs-utilsyum -y install rpcbind nfs-utils #安装rpc跟nfs服务mkdir /nfs && chmod 666 /nfs #创建指定共享目录并修改相应权限修改配置文件:vim /etc/exports #编辑文件/nfs 192.168.88.0/24(rw,no_root_squash,no_all_squash,sync) #保存退出exportfs -rv #载入配置注意IP网段后面紧接括号,没有空格##格式为:/共享目录 允许访问的网段(参数)##链接:NFS参数配置启动服务:systemctl start rpcbind #启动rpc服务systemctl start nfs #启动nfs服务服务检查:cat /var/lib/nfs/etab showmount -e localhost客户端配置:mount -t nfs 192.168.88.91:/nfs /mnt #将服务nfs目录挂载至本机/mntdf -h #查看挂载结果!##实验完毕。对于开机启动挂载,建议配置systemd服务,通过编写服务来进行开机挂载,注意启动顺序在网络服务后面

February 17, 2019 · 1 min · jiezi

在Linux Debian 8下部署基于PHP的Web项目。

折腾了大半天,总算把项目部署到了服务器上,这里写一篇文章记录一下,当作做学习笔记,同时也给其他想要部署项目的朋友一点思路。目前Linux系统的分支比较多,我了解到的目前分为Debian、Ubuntu等和RedHat、centnOS等。他们的主要操作命令都一样,个别会有所区别,所以这个教程可能不太适用于centOS等一些系统,但应该有参考价值!一、概览和准备工作我的项目是一个简单的手机商城,前端就是HTML+CSS+JS,外加一个Jquery,只适配了PC端。后端使用了PHP和MySql。所以在服务器上就需要LAMP环境(我们常说的Linux+Apache+MySql+PHP,其他的还有LNMP环境,就是Web服务器换成Nginx)。必要的准备工作Xshell+Xftp软件一个云服务器已经完成的项目代码和数据库数据二、购买云服务器目前国内有很多提供商,阿里、腾讯云等等,大家买的时候可以买境外的,比如香港,这个不用备案(备案要花一定时间),自己斟酌就好。我目前买的Vultr的。服务器的购买大家在网上就可以找到答案,这里就不在做篇幅讲解了!三、下载Xshell和XftpXshell用来连接服务器进行操作的,Xftp用来传项目到服务器。目前连接服务器和上传文件有很多种,这里我选了简单些的,其他方法大家可以去找找。这里我给一个度盘地址给大家,下载下来安装好即可。Xshell和Xftp 提取码:mcnl

February 16, 2019 · 1 min · jiezi

rsync+inotify实时同步

数据实时同步在生产中有一种需求是,当目录下的文件数据发生变化时,就将数据备份到备份服务器上。实现这样的需求需要做到以下两点:利用监控服务(inotify),监控到要同步服务器的目录文件的变化发现目录数据发生变化就利用rsync服务将数据发送到备份服务器因此,利用rsync+inotify可实现数据的实时同步。Inotify介绍Inotify是一种强大的,细粒度的。异步的文件系统事件监控机制,linux内核从2.6.13起,加入了 Inotify支持,通过Inotify可以监控文件系统中添加、删除,修改、移动等各种事件,利用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化情况,而 inotify-tools 正是实施这样监控的软件。Inotify实际是一种事件驱动机制,它为应用程序监控文件系统事件提供了实时响应事件的机制,而无须通过诸如cron等的轮询机制来获取事件。cron等机制不仅无法做到实时性,而且消耗大量系统资源。相比之下,inotify基于事件驱动,可以做到对事件处理的实时响应,也没有轮询造成的系统资源消耗,是非常自然的事件通知接口,也与自然世界事件机制相符合。Inotify安装环境介绍[root@moli-linux03 ~] uname -r3.10.0-862.2.3.el7.x86_64[root@moli-linux03 ~] cat /etc/redhat-release CentOS Linux release 7.5.1804 (Core)安装前提需要2.6.13以后内核版本才能支持inotify软件。2.6.13内核之后版本,在没有安装inotify软件之前,应该有这三个文件。[root@moli-linux03 ~] ll /proc/sys/fs/inotify/总用量 0-rw-r–r–. 1 root root 0 2月 3 12:24 max_queued_events-rw-r–r–. 1 root root 0 2月 3 12:24 max_user_instances-rw-r–r–. 1 root root 0 2月 3 12:24 max_user_watches[root@moli-linux03 ~] 三个文件的说明文件默认值作用说明 max_user_watches8192设置inotifywait或inotifywatch命令可以监视的文件数量(单进程)max_user_instances128设置每个用户可以运行的inotifywait或inotifywatch命令的进程数max_queued_events16384设置inotify实例事件(event)队列可容纳的事件数量注:可以将三个文件的数值调大,监听更大的范围安装方式可选择yum安装或者编译安装,yum安装需要配置有epel源,编译安装需要到github下载源码包。yum安装yum install -y inotify-tools编译安装(源码包地址:https://github.com/rvoicilas/…tar -zxf tar -zxf inotify-tools-3.13.tar.gz ./configuremakemake installinotify主要安装的两个软件inotifywait: (主要) 在被监控的文件或目录上等待特定文件系统事件(open close delete等)发生,执行后处于阻塞状态,适合在shell脚本中使用inotifywatch: 收集被监控的文件系统使用的统计数据,指文件系统事件发生的次数统计。 说明:在实时实时同步的时候,主要是利用inotifywait对目录进行监控inotifywait重要命令参数说明参数说明-m始终保持事件监听-r递归监控目录数据信息变化-q输出信息少(只打印事件信息)-timefmt指定时间输出格式-format打印使用指定的输出类似格式字符串;即实际监控输出内容-e指定监听指定的事件,如果省略,表示所有事件都进行监听 -e[参数] 可以指定的事件类型事件名称说明close_write文件或目录关闭,在写入模式打开之后关闭的。move文件或目录不管移动到或是移出监控目录都触发事件create文件或目录创建在监控目录中delete文件或目录被删除在监控目录中示例测试对一个服务器打开两个终端窗口,终端1执行创建,删除,修改,移动文件等操作,终端2执行inotifywait命令。创建事件[root@终端2 ~] inotifywait -mrq /root/rsync_test –timefmt “%d-%m-%y %H:%M” –format “%T %w%f 事件信息: %e” -e create[root@终端1 rsync_test]# touch 1.txt下面显示出事件信息,在终端一执行创建文件操作之后终端二才显示的事件03-02-19 12:48 /root/rsync_test/1.txt 事件信息: CREATE删除事件[root@moli_linux1 ~]# inotifywait -mrq /data –timefmt “%d-%m-%y %H:%M” –format “%T %w%f 事件信息: %e” -e delete[root@moli_data ~]# rm -f 1.txt修改事件[root@moli_linux1 ~]# inotifywait -mrq /data –timefmt “%d-%m-%y %H:%M” –format “%T %w%f 事件信息: %e” -e close_write[root@moli_data ~]# echo “hahaha” > 2 .txt移动事件move_to把其他目录文件移动到监控目录[root@moli_linux1 ~]# inotifywait -mrq /data –timefmt “%d-%m-%y %H:%M” –format “%T %w%f 事件信息: %e” -e moved_to[root@moli_data ~]# mv /etc/passwd .移动事件move_from把监控目录文件移到其他目录[root@moli_linux1 ~]# inotifywait -mrq /data –timefmt “%d-%m-%y %H:%M” –format “%T %w%f 事件信息: %e” -e moved_from[root@moli_data ~]# mv 2.txt /tmp inotifywait –timefmt时间参数说明命令参数说明%y年份信息,显示信息为十进制,并且没有世纪信息%m显示月份,显示信息为十进制(范围 01-12 )%d每月的第几天,显示倍息为十进制数(范围是 01-31 )%H小时信息,显示信息为十进制,使用 24小时制(范围 00-23 )%M显示分钟,显示信息为十进制(范围 00-59 )inotifywait –format参数说明命令参数说明%w事件出现时,监控文件或目录的名称信息%f事件出现时,将显示监控目录下触发事件的文件或目录信息,否则为空%e显示发生的事件信息,不同的事件信息用逗号进行分隔%T输出时间格式中定义的时间格式信息,通过 –timefmt option 语法格式指定时间信息这个格式是通过strftime函数进行匹配时间格式信息的Linux文件同步工具rsync介绍rsync是一款开源,快速,多功能的可实现增量的本地或远程的数据镜像同步备份的优秀工具。适用于多个平台。从软件名称可以看出来是远程同步的意思(remote sync)。可使本地主机不同分区或目录之间及本地和远程两台主机之间的数据快速同步镜像,远程备份等功能。在同步备份时,默认情况下,rsync通过其独特的“quick check”算法,仅同步大小或者最后修改时间发生变化的文件或目录(也可根据权限,属主等变化同步,需要制定参数)。甚至是只同步一个文件里变化的内容部分,所以可以实现快速的同步数据的功能。提示:传统的cp,scp工具拷贝每次均为完整拷贝,而rsync除了完整拷贝,还具备增量拷贝的功能,因此从此性能及效率上更胜一筹。Rsync的特性1)支持拷贝特殊文件如链接,设备等2)可以有排除指定文件或目录同步的功能,相当于打包命令tar3)可以保持原来文件或目录的权限,时间,软硬链接等所有属性均不改变。4)可实现增量同步,即只同步发生变化的数据,因此数据传输效率更高5)可以使用rcp,rsh,ssh等方式来配合传输文件,也可以通过直接的socker链接6)支持匿名的或认证的进程模式传输,方便进行数据备份及镜像。核心算法介绍假定在名为和的两台计算机之间同步相似的文件 A 与 B ,其中对文件 A 拥有访问权,对文件 B 拥有访问权。并且假定主机与之间的网络带宽很小。那么 rsync 算法将通过下面的五个步骤来完成:将文件 B 分割成一组不重叠的固定大小为 S 字节的数据块。最后一块可能会比 S 小。对每一个分割好的数据块执行两种校验:一种是 32 位的滚动弱校验,另一种是 128 位的 MD4 强校验。将这些校验结果发给。通过搜索文件 A 的所有大小为 S 的数据块 ( 偏移量可以任选,不一定非要是 S 的倍数 ) ,来寻找与文件 B 的某一块有着相同的弱校验码和强校验码的数据块。这项工作可以借助滚动校验的特性很快完成。发给一串指令来生成文件 A 在上的备份。这里的每一条指令要么是对文件 B 经拥有某一个数据块而不须重传的证明,要么是一个数据块,这个数据块肯定是没有与文件 B 的任何一个数据块匹配上的。结论:rsync就是会同步我们指定的两端目录之间的数据,这个数据可以是特殊的数据。同步之前就先进行两端的数据的比对,只会同步两者之间不同的部分,并保留文件原本的属性。并且支持匿名的方式进行同步传输。所以rsync在备份,同步上就会较为快速。rsync命令常用选项选项说明-a(重要)包含-rtplgoD选项-r(重要)同步目录时要加上,类似cp命令的-r选项-v(重要)同步时显示一些信息,让我们知道同步的过程-l保留软链接-L同步软链接时会把源文件给同步-p保持文件的权限属性-o保持文件的属主-g保持文件的属组-D保持设备文件信息-t保持文件的时间属性–delete删除DEST中SRC没有的文件–exclude过滤指定文件,如–exclude “logs” 会把文件名包含logs的文件或者目录过滤掉,不同步-p显示同步过程,比如速率,比-v更加详细-u如果DEST中的文件比SRC新,就不会同步-z传输时压缩rsync的简单示例示例1 将目录下1.txt拷贝到本目录下的2.txt在本地里使用rsync就类似于cp命令[root@moli-linux03 rsync_test]# ls1.txt[root@moli-linux03 rsync_test]# rsync -av 1.txt 2.txtsending incremental file list1.txtsent 87 bytes received 35 bytes 244.00 bytes/sectotal size is 0 speedup is 0.00[root@moli-linux03 rsync_test]# ls1.txt 2.txt示例2 把/etc/passwd文件拷贝到远程主机的/tmp目录下,并改名叫1.txtrsync -av /etc/passwd root@192.168.199.7:/tmp/1.txt示例3 通过ssh同步,指定端口号rsync -av -e “ssh -p 22” /etc/passwd 192.168.199.3:/tmp/test示例4 通过服务进行同步(休息一下…) ...

February 3, 2019 · 2 min · jiezi

进入docker的世界

最近学习Machine Learning发现好多人都用docker,之前一直听说但是感觉和自己无关。但是现在发现原来docker是个这么方便的东西,可以跨平台(不分什么版本的linux,甚至mac和windows也行)运行。所以这里开一篇来记录学习感受。参考:Docker 完全指南参考: Gitbook - Docker — 从入门到实践不提那些难懂的术语,大白话就是:一个Docker就是一个Linux的Live CD系统,跟USB系统一样,有完整的系统文件目录和程序。我们可以在这个与外界隔离的便携系统里随便读写操作,只是每次进入它时候,都会恢复最开始的样子,像什么事都没发生一样。我们可以像定制Live CD或WinPE一样,定制这个小系统里面默认装什么软件。一旦定制好了,就是不可更改的,非常稳定。理解Docker的逻辑一开始发现很乱很难理解,觉得所有人都把它说的太复杂了。直到后来发现,其实它的运行逻辑很简单。实际上,可以把Docker看成是给电脑安装Linux系统时的Live CD,或者是给Windows用USB安装系统时的WinPE。这样会方便理解一点。回想下自己在给PC或是虚拟机上安装Linux系统时,都会有个Live CD选项。也是就是你可以什么都不安装,直接进入系统,所有的工具都能用,所有的软件都能安装,所有的配置也可以改。只不过你重启过后,一切修改的地方都恢复原样了。每篇攻略都会提到这三个基本概念:镜像 Image相当于一个系统光盘的ISO镜像文件,是只读的。你可以直接进入image中各种操作没有障碍,感觉就像进入_Live CD_系统了。只是所有操作都会在退出时消失,下次进image时候还是初始的样子。容器 Container就像给"ISO文件"加了一层可读写的外衣,所有的变动都会保存在Container里,而image还是image,不会变。就像你可以随便换衣服,但是身体不会变。仓库 Repo一般指的Dockerhub,就是一个像Github的网站,只不过不是收集代码,而是收集各种image镜像。你可以随意上传下载各大厂商或个人制作的镜像。安装DockerDocker分CE和EE两个版本,一个社区公开免费,一个商业付费。参考官方:About Docker CEUbuntu上安装Docker参考官方安装步骤:Get Docker CE for Ubuntu准备工作:#安装SSL相关,让apt通过HTTPS下载:sudo apt-get install apt-transport-https ca-certificates curl software-properties-common# 添加docker的GPG keycurl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -#检查key是否相符(9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88)sudo apt-key fingerprint 0EBFCD88#添加docker的apt下载源sudo add-apt-repository “deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable”#更新源sudo apt-get update安装docker:$ sudo apt-get install docker-ce卸载Docker:$ sudo apt-get remove docker docker-engine docker.ioMac上安装Docker直接下载app:树莓派上安装Docker树莓派是基于ARM架构的,和PC不同。所以即使树莓派上能做一些docker镜像,也不能在别的PC上运行。反过来别的PC上的docker镜像,也不能在树莓派上运行。如果需要找树莓派专用的镜像,那就在Dockerhub上搜索ARM或Rpi相关就能找到了。有一个叫Hypriot的仓库制作了非常多树莓派专用docker,可以参考下。树莓派安装Docker,最难的在于正确的选择源和添加GPG-key,才能找到版本适合的docker并下载。这个过程是非常繁琐且很难有统一方案的。另外:官方的一键安装版本已经失效了。必须手动操作。参考另一篇笔记:树莓派安装Docker运行Docker[站外图片上传中…(image-e81557-1548159126389)]从Image镜像创建一个Container容器:# 新建一个Container容器(如果本地有image则直接从它创建,如果没有则从网上下载)# 进入docke的shell -t,即进入虚拟的一个系统,有自己的/root文件系统结构$ docker run -it <repo>:<tag> <CMD>#如:$ docker run -it jekyll/jekyll:latest bash# 为container指定名称(而不是只用ID来引用)$ docker run -it –name <NAME> <image-ID>查看已有的:# 查看已有的images$ docker images# 查看已创建的containers$ docker container ls -a运行一个已有的Container:# 先启动container$ docker container <ID> start# 运行(挂载)container,挂载后自动进入容器里的shell$ docker attach <ID># 或者一句话完成(–attach)$ docker start -a<ID> 删除已有的:# 删除image$ docker rm <Image-ID># 删除container$ docker rm <Container-ID>无需sudo执行docker为了每次执行docker不需要总是输入sudo,我们需要为docker创建一个用户组,并授予权限才行:# 创建docker用户组sudo groupadd docker# 把当前用户加入到docker用户组sudo gpasswd -a $USER docker# 更新当前用户组变动(就不用退出并重新登录了)newgrp docker挂载Host主机上的文件夹我们肯定不会满足于docker只访问自己的小世界里的文件系统(什么数据都没有),所以有必要让它能访问外界Host主机上的一些文件夹。比如我有一个docker是作为下载机用的,那么我肯定得让它把下载好的东西存到我的主机上,要不然就白下载了。参考:Docker学习—挂载本地目录挂载文件夹是在docker运行镜像的命令里就指定的(利用-v参数):$ docker run -it -v <HOST-PATH>:<DOCKER-PATH> ubuntu64 /bin/bash#或者作为只读挂载 (:ro)$ docker run -it -v <HOST-PATH>:<DOCKER-PATH>:ro ubuntu64 /bin/bash注意,挂载的双方都必须是绝对路径。映射Docker里的端口到Host主机上的端口如果Docker里运行的是Web服务比如Nginx,里面有一个网站,那你必须得把”虚拟机“里的端口映射到外部才能正常看到网页。映射是在运行docker命令时指定的,比如把里面的80端口映射到外面的8888端口,命令如下:$ docker run –name webserver -d -p 80:8888 nginx然后你在主机上的浏览器访问http://localhost:8888,就可以看到nginx里的网页了。Docker镜像保存更改直接在镜像上改动的内容,会在退出时全部消失。但是我们经常需要把这些变动保存下来。Docker保存这些变动的机制就是——生成另一个只读镜像。(-_-!)虽然正常看来,这不太好吧。但实际上,这很好!Docker镜像实际上是非常小的,所以生成另一个镜像也没有多费事。而且这种机制保证了每个镜像的不可随便修改的性质,这一点就极大的避免了混乱。Docker保存更改有两种方式:docker commit:就像git commit一样,把每次改动作为一个commit提交,可以追溯历史Dockerfile:这是从头build构建一个镜像的配置文件,把你想改动的地方(如安装一个程序)写成一句bash命令,加到Dockerfile这个文件里,它就会按照你的要求执行所有的命令,然后生成一个新的镜像。Commit可以追溯历史,但是变动了哪些地方是对外界黑箱的。Dockerfile确实明明白白写清楚有哪些改变。所以一般情况下,正式构建一个镜像,都是用Dockerfile的。“docker commit” 将变动过的Container保存为镜像参考:利用 commit 理解镜像构成docker commit命令,可以将容器的存储层保存下来成为镜像。换句话说,就是在原有镜像的基础上,再叠加上容器的存储层,并构成新的镜像。以后我们运行这个新镜像的时候,就会拥有原有容器最后的文件变化。慎用docker commit:由于命令的执行,还有很多文件被改动或添加了。这还仅仅是最简单的操作,如果是安装软件包、编译构建,那会有大量的无关内容被添加进来,如果不小心清理,将会导致镜像极为臃肿。此外,使用 docker commit 意味着所有对镜像的操作都是黑箱操作,生成的镜像也被称为黑箱镜像,换句话说,就是除了制作镜像的人知道执行过什么命令、怎么生成的镜像,别人根本无从得知。而且,即使是这个制作镜像的人,过一段时间后也无法记清具体在操作的。虽然 docker diff 或许可以告诉得到一些线索,但是远远不到可以确保生成一致镜像的地步。这种黑箱镜像的维护工作是非常痛苦的。而且,回顾之前提及的镜像所使用的分层存储的概念,除当前层外,之前的每一层都是不会发生改变的,换句话说,任何修改的结果仅仅是在当前层进行标记、添加、修改,而不会改动上一层。如果使用 docker commit 制作镜像,以及后期修改的话,每一次修改都会让镜像更加臃肿一次,所删除的上一层的东西并不会丢失,会一直如影随形的跟着这个镜像,即使根本无法访问到。这会让镜像更加臃肿。 ...

January 26, 2019 · 1 min · jiezi

Linux 的常用命令

Linux 的常用命令linux的命令操作,这里简单的记录一下常用的。1、日常操作命令查看当前所在的工作目录pwd查看当前系统的时间date查看有谁在线(哪些人登陆到了服务器)who 查看当前在线last 查看最近的登陆历史记录修改开机的等待时间2、文件系统操作显示信息lsls / 查看根目录下的子节点(文件夹和文件)信息ls -al -a是显示隐藏文件 -l是以更详细的列表形式显示切换目录cd /home创建文件夹mkdir aaa 这是相对路径的写法 mkdir -p aaa/bbb/cccmkdir /data 这是绝对路径的写法删除文件夹rmdir 可以删除空目录rm -r aaa 可以把aaa整个文件夹及其中的所有子节点全部删除rm -rf aaa 强制删除aaa修改文件夹名称mv aaa angelababy创建文件touch somefile.1 创建一个空文件echo “i miss you,my baby” > somefile.2 利用重定向“>”的功能,将一条指令的输出结果写入到一个文件中,会覆盖原文件内容echo “huangxiaoming ,gun dan” >> somefile.2 将一条指令的输出结果追加到一个文件中,不会覆盖原文件内容查看文件多少个单词,多少行wc -w READMEwc -l README查看文件tail -f somefile 根据inode 节点跟踪tail -F somefile 根据 文件名 跟踪解压和压缩1.gzip压缩gzip a.txt2.解压gunzip a.txt.gzgzip -d a.txt.gz3.bzip2压缩bzip2 a4.解压bunzip2 a.bz2bzip2 -d a.bz25.将当前目录的文件打包tar -cvf bak.tar .将/etc/password追加文件到bak.tar中(r)tar -rvf bak.tar /etc/password6.解压tar -xvf bak.tar7.打包并压缩gziptar -zcvf a.tar.gz8.解压缩解压到/usr/下tar -zxvf a.tar.gz -C /usr9.查看压缩包内容tar -ztvf a.tar.gzzip/unzip10.打包并压缩成bz2tar -jcvf a.tar.bz211.解压bz2tar -jxvf a.tar.bz2用vi文本编辑器来编辑生成文件最基本用法vi somefile.41、首先会进入“一般模式”,此模式只接受各种快捷键,不能编辑文件内容2、按i键,就会从一般模式进入编辑模式,此模式下,敲入的都是文件内容3、编辑完成之后,按Esc键退出编辑模式,回到一般模式;4、再按:,进入“底行命令模式”,输入wq命令,回车即可一些常用快捷键一些有用的快捷键(在一般模式下使用):a 在光标后一位开始插入A 在该行的最后插入I 在该行的最前面插入gg 直接跳到文件的首行G 直接跳到文件的末行dd 删除行,如果 5dd ,则一次性删除光标后的5行yy 复制当前行, 复制多行,则 3yy,则复制当前行附近的3行p 粘贴v 进入字符选择模式,选择完成后,按y复制,按p粘贴ctrl+v 进入块选择模式,选择完成后,按y复制,按p粘贴shift+v 进入行选择模式,选择完成后,按y复制,按p粘贴查找并替换(在底行命令模式中输入)%s/sad/88888888888888 效果:查找文件中所有sad,替换为88888888888888/you 效果:查找文件中出现的you,并定位到第一个找到的地方,按n可以定位到下一个匹配位置(按N定位到上一个)3、文件权限的操作linux文件权限的描述格式解读drwxr-xr-x (也可以用二进制表示 111 101 101 –> 755)d:标识节点类型(d:文件夹 -:文件 l:链接)r:可读 w:可写 x:可执行 第一组rwx: 表示这个文件的拥有者对它的权限:可读可写可执行第二组r-x: 表示这个文件的所属组对它的权限:可读,不可写,可执行第三组r-x: 表示这个文件的其他用户(相对于上面两类用户)对它的权限:可读,不可写,可执行修改文件权限chmod g-rw haha.dat 表示将haha.dat对所属组的rw权限取消chmod o-rw haha.dat 表示将haha.dat对其他人的rw权限取消chmod u+x haha.dat 表示将haha.dat对所属用户的权限增加x也可以用数字的方式来修改权限chmod 664 haha.dat 就会修改成 rw-rw-r–如果要将一个文件夹的所有内容权限统一修改,则可以-R参数chmod -R 770 aaa/chown angela:angela aaa/ <只有root能执行>目录没有执行权限的时候普通用户不能进入文件只有读写权限的时候普通用户是可以删除的(删除文件不是修改它,是操作父及目录),只要父级目录有执行和修改的权限4、基本的用户管理添加用户useradd angela要修改密码才能登陆 passwd angela 按提示输入密码即可为用户配置sudo权限用root编辑 vi /etc/sudoers在文件的如下位置,为hadoop添加一行即可root ALL=(ALL) ALL hadoop ALL=(ALL) ALL然后,hadoop用户就可以用sudo来执行系统级别的指令[hadoop@shizhan ~]&dollar; sudo useradd huangxiaoming添加一个tom用户,设置它属于users组,并添加注释信息分步完成:useradd tom usermod -g users tom usermod -c “hr tom” tom一步完成:useradd -g users -c “hr tom” tom设置tom用户的密码passwd tom修改tom用户的登陆名为tomcatusermod -l tomcat tom将tomcat添加到sys和root组中usermod -G sys,root tomcat查看tomcat的组信息groups tomcat添加一个jerry用户并设置密码useradd jerrypasswd jerry添加一个交america的组groupadd america将jerry添加到america组中usermod -g america jerry将tomcat用户从root组和sys组删除gpasswd -d tomcat rootgpasswd -d tomcat sys将america组名修改为amgroupmod -n am america5、系统管理操作主机名操作hostname****修改主机名(重启后无效)hostname hadoop修改主机名(重启后永久生效)vi /ect/sysconfig/networkchkconfig设置后台服务的自启动配置chkconfig 查看所有服务的自启动配置chkconfig iptables off 关掉指定服务的自启动checonfig iptables on 开启指定服务的自启动系统启动级别管理vi /etc/inittabcentos7 之后 inittab is no longer used when using systemd 不再使用了。IP地址文件的详解修改IP(重启后无效)ifconfig eth0 192.168.12.22修改IP(重启后永久生效)vi /etc/sysconfig/network-scripts/ifcfg-ens32里面内容的解释:TYPE=“Ethernet” # 这个是类型不用管PROXY_METHOD=“none” # 这个是代理方式,不用管BROWSER_ONLY=“no” # 仅浏览器模式,不用管BOOTPROTO=“dhcp” # 网卡获得ip地址的方式, dhcp 代表自动获取,static(静态 ip地址)bootip(通过bootp协议获得的ip地址)DEFROUTE=“yes” # 默认路由IPV4_FAILURE_FATAL=“no"IPV6INIT=“yes"IPV6_AUTOCONF=“yes"IPV6_DEFROUTE=“yes"IPV6_FAILURE_FATAL=“no"IPV6_ADDR_GEN_MODE=“stable-privacy"NAME=“ens32” # 网卡名称UUID=“026a2b15-42ea-472f-86d6-9913d19aff3e” ##UUID不用管DEVICE=“ens32” # 网卡名称ONBOOT=“yes” # 开机启动如果把BOOTPROTO 修改成 static,一般情况下只需要配置如下就行:BOOTPROTO=static #改为static 静态ipIPADDR=192.168.126.166 # 这里需要指定 ipGATEWAY=192.168.126.2 # 指定网关NETMASK=255.255.255.0 # 指定子网掩码ONBOOT=yes # 开机启动DNS1=192.168.126.2 # DNS 指定网关就行 可以不配置DNS2=8.8.8.8mount 挂载外部存储设备到文件系统中mkdir /mnt/cdrom 创建一个目录,用来挂载mount -t iso9660 -o ro /dev/cdrom /mnt/cdrom/ 将设备/dev/cdrom挂载到 挂载点 : /mnt/cdrom中***umountumount /mnt/cdrom统计文件或文件夹的大小du -sh /mnt/cdrom/Packagesdf -h 查看磁盘的空间开关机关机halt重启reboot配置主机之间的免密ssh登陆假如 A 要登陆 B在A上操作:%%首先生成密钥对ssh-keygen (提示时,直接回车即可)%%再将A自己的公钥拷贝并追加到B的授权列表文件authorized_keys中ssh-copy-id B原理如下图所示:上传文件上传文件到linux上, 是上传到当前所在的目录下yum list|grep lrzszsudo yum -y install lrzsz.x86_64命令:(参数 -y 如果linux上有相同的文件, 会覆盖)rzrz -y6、正则表达式1.cut截取以:分割保留第七段grep hadoop /etc/passwd | cut -d: -f72.排序du | sort -n 3.查询不包含hadoop的grep -v hadoop /etc/passwd4.正则表达包含hadoopgrep ‘hadoop’ /etc/passwd5.正则表达(点代表任意一个字符)grep ‘h.p’ /etc/passwd6.正则表达以hadoop开头grep ‘^hadoop’ /etc/passwd7.正则表达以hadoop结尾grep ‘hadoop&dollar;’ /etc/passwd规则:. : 任意一个字符a : 任意多个a(零个或多个a)a? : 零个或一个aa+ : 一个或多个a.* : 任意多个任意字符. : 转义.<h.*p> :以h开头,p结尾的一个单词o{2} : o重复两次grep ‘^i.{18}n&dollar;’ /usr/share/dict/words查找不是以#开头的行grep -v ‘^#’ a.txt | grep -v ‘^&dollar;’ 以h或r开头的grep ‘^[hr]’ /etc/passwd不是以h和r开头的grep ‘^1’ /etc/passwd不是以h到r开头的grep ‘^2’ /etc/passwd7、输入输出重定向1.新建一个文件touch a.txt> b.txt2.错误重定向:2>find /etc -name zhaoxing.txt 2> error.txt3.将正确或错误的信息都输入到log.txt中find /etc -name passwd > /tmp/log.txt 2>&1 find /etc -name passwd &> /tmp/log.txt4.追加>>5.将小写转为大写(输入重定向)tr “a-z” “A-Z” < /etc/passwd6.自动创建文件cat > log.txt << EXIT> ccc> ddd> EXI7.查看/etc下的文件有多少个?ls -l /etc/ | grep ‘^d’ | wc -l8.查看/etc下的文件有多少个,并将文件详情输入到result.txt中ls -l /etc/ | grep ‘^d’ | tee result.txt | wc -l8、进程管理1.查看用户最近登录情况lastlastlog2.查看硬盘使用情况df3.查看文件大小du4.查看内存使用情况free5.查看文件系统/proc6.查看日志ls /var/log/7.查看系统报错日志tail /var/log/messages8.查看进程top9.结束进程kill 1234kill -9 4333VMware 机器克隆IP不可用问题直接修改 /etc/sysconfig/network-script/ifcfg-eth0删掉UUID HWADDR配置静态地址然后:rm -rf /etc/udev/rules.d/70-persistent-net.rules然后 reboothr ↩h-r ↩ ...

January 25, 2019 · 2 min · jiezi

PHP与Mysql8不兼容问题汇总

在安装Mysql8.0之后,需要跟我们原有的PHP进行协同工作,然而原先与Mysql5.1能够很好协同的代码,突然报错,看来需要做一些额外的工作。报错:PDO::__construct(): Server sent charset (255) unknown to the client. Please, report to the developers根据网上资料显示,是由于Mysql8.0将默认的字符集改为了utfmb4,因此和客户端(不仅仅是PHP)的通信无法识别,我们需要更改my.cnf来指定字符集。[client]default-character-set=utf8[mysql]default-character-set=utf8[mysqld]collation-server = utf8_unicode_cicharacter-set-server = utf8报错:PDO::__construct(): The server requested authentication method unknown to the client [caching_sha2_password]根据网上资料显示,是由于用户身份认证的加密方式不兼容导致的,mysql8.0中默认方式为caching_sha2_password,引起老版本兼容性问题,老版本加密方式为mysql_native_password。新建用老版加密方式初始化密码的用户即可:CREATE USER username@localhost identified with mysql_native_password by ‘password’;报错:Access denied for user ‘root’@’localhost’ (using password: YES)mysql> GRANT ALL PRIVILEGES ON . TO ‘oss’@’%’;ERROR 1045 (28000): Access denied for user ‘root’@’localhost’ (using password: YES)在我给其他用户加权限的时候,报错无权限,原因是我一不小心删掉了root身份的用户,虽然网上有很多的文档解决这个问题,但是我重建后的root用户虽然拥有Grant_priv: Y但依然无法成功分配权限,我很头疼。解决方法:重装,参考文章安装Mysql8.0。总结mysql8.0有什么新的特性我没有详细查看文档,但是兼容性先让我吃了一顿苦头,还好在解决完这3个问题后,我的PHP程序成功跑了起来,下面我要去升级PHP5.1到PHP7了。参考资料PDO::__construct(): Server sent charset (255) unknown to the client. Please, report to the developers:https://stackoverflow.com/que…PDO::__construct(): The server requested authentication method unknown to the client [caching_sha2_password]:https://stackoverflow.com/que…安装Mysql8.0:https://segmentfault.com/a/11… ...

December 13, 2018 · 1 min · jiezi

最好用的编辑器之一:Vim-Go环境搭建

本文由Librant发表如果说在Linux环境下,什么编辑器最好用,如果我说是VIM,估计会有一大部分人嗤之以鼻,怎么可能。VIM可能是他用过众多编辑器最难用的一个。在我司用的是云虚拟机,说实话吧,这里吐槽一下,是真的卡,没开几个网页,打开几个软件就卡的不要不要的,后来码代码的时候,能用Linux机器我就尽量使用Linux环境,如果读者正好也是一名Gopher的话,那我就强烈建议你使用VIM,Vim-go是当前使用最为广泛的用于搭建Golang开发环境的vim插件。好了,废话不多说,看我搭建好的界面吧。图 Go-Vim界面看到这个界面,读者是不是不认识了,这就对了,是不是觉得很炫酷,其实Vim有很多的插件,可以把Vim打造的非常棒,等读者查阅相关资料,清楚Vim的各种参数的时候,就可以根据自己的喜好,搭建不同风格的Go开发环境啦。So废话不多说,开整。(建议先看完《跟我学Docker》的第一章部分)1.1 环境准备 能成功从gitHub拉取代码,Go编译器安装完成之后,就可以在搭建Go-Vim啦。首先是在当前用户的HOME目录下创建 .vim 目录和 .vimrc 文件:librant@ubuntu:$ mkdir .vimlibrant@ubuntu:$ touch .vimrc创建完成之后,进入到 .vim 中,下载插件 Vim 的插件管理器bundle:librant@ubuntu:/.vim$ mkdir bundle然后进入到 bundle 目录中,安装Vundle.vim:librant@ubuntu:/.vim/bundle$ git clone git clone https://github.com/VundleVim/…下载完成之后,会在当前目录下生成 Vundle.vim 目录同样进入到 bundle 目录中,安装Vim-go:librant@ubuntu:/.vim/bundle$ git clone https://github.com/fatih/vim-…下载完成之后,会在当前目录下生成 vim-go 目录1.2 插件安装/(用户$HOME) 目录下已经有 .vimrc文件就不需要再创建了。(" 为注释部分)。1.2.1 安装Vundle.vim在 .vimrc 文件中添加如下配置:set nocompatiblefiletype offset rtp+=~/.vim/bundle/Vundle.vimcall vundle#begin()Plugin ‘gmarik/Vundle.vim’call vundle#end()filetype plugin indent on保存后,退出。1.2.2 安装Vim-go继续编辑 .vimrc文件,在call vundle#begin()和call vundle#end()之间再添加如下配置:Plugin ‘fatih/vim-go’保存后,重新打开 vim 编辑器,在命令行的模式输入:PluginInstall:PluginInstall执行之后会在左侧出现需要安装的插件列表,右侧是.vimrc文件。如图1-2-2所示:图 1-2-2 Vim插件安装界面刚执行时,左下角会出现 Processing的过程,需要稍微等一会儿,这是在下载代码,安装完成之后,左下角将出现Done!的单词,表示已经安装完成。1.2.3 安装 go.tools Binaries Vim-go安装中需要使用到Go的相关的二进制工具。由于历史的原因,在google上的工具是无法自行下载安装的,在gitHub上的工具是可以安装成功的。首先打开 .vimrc 文件,切换到命令行模式,执行 GoInstallBinaries 命令自行安装。:GoInstallBinaries等待 Vim-go依赖的工具自动安装,如果安装成功后,会在 $GOPATH/bin 目录下生成。安装完成后如图1-2-3所示:图 1-3-2 vim-go依赖的命令文件由于有些命令文件是无法自动安装完成,这就需要手动进行安装啦。首先对比目录,看缺少哪些命令没有安装完成,然后去gitHub上搜索,找到对应的命令源码之后,使用git clone 下载到本地,然后使用 go install命令进行安装即可。前面已经讲解过如何安装啦,这里就不再赘述。相关工具的gitHub路径:golint: https://github.com/golang/lin...gocode: https://github.com/nsf/gocode...errcheck: https://github.com/kisielk/er...gotags: https://github.com/jstemmer/g...(缺少什么工具,基本都可以找到的,这里就不一一列举了)1.3 VIM主题颜色 Vim的主题颜色保存在 /usr/share/vim/vim80/colors 目录下保存,如果目录下没有的主题,就需要自己进行下载了。下载到此目录的颜色主题,将可以被所有用户使用,如果只需要在当前用户下使用,可以将下载的主题放在 /.vim/colors 目录下即可。个人比较喜欢molokai主题风格,下面就简单介绍如何下载这个主题吧。 1)在gitHub上搜索 molokai 主题,找到主题的git仓库 tomasr/molokai 2)进入到 .vim目录下,使用git clone 下载主题librant@ubuntu:/.vim$ git clone https://github.com/tomasr/mol… 3)下载完成之后,拷贝 molokai/colors/molokai.vim 文件到 ~/.vim/colors 目录下 4)配置 .vimrc 文件,在文件中红添加如下信息:set t_Co=256colorscheme molokailet g:molokai_original = 1let g:rehash256 = 1需要配置其他的主题,只需要设置相应的主题名称。1.4 其他插件安装1.4.1 SirVer/ultisnips UltiSnips是Vim的代码片段工具,它只是一个引擎,它需要和vim-snippets搭配使用。vim-snippets预定义了几十种语言常用的代码模板,位于 ~/.vim/bundle/vim-snippets/UltiSnips/,UltiSnips 有一套自己的代码模板语法规则。在 .vimrc中的配置如下:Plugin ‘honza/vim-snippets’Plugin ‘SirVer/ultisnips’“插入模式下直接通过<C-z>键来触发UltiSnips的代码块补全let g:UltiSnipsExpandTrigger="<C-z>““弹出UltiSnips的可用列表,由于不常用, 所以这里设置成了特殊的<C-i>映射let g:UltiSnipsListSnippets="<C-i>”"<C-f>跳转的到下一个代码块可编辑区let g:UltiSnipsJumpForwardTrigger="<C-f>”"<C-b>跳转到上一个代码块可编辑区let g:UltiSnipsJumpBackwardTrigger="<C-b>“增加位置如Go-vim的位置一致,安装过程也是类似的。gitHub的代码路径如下所示:honza/vim-snippets: https://github.com/honza/vim-...SirVer/ultisnips: https://github.com/SirVer/ult...1.4.2 scrooloose/nerdtree NERDTree的作用就是列出当前路径的目录树,一般IDE都是有的。可以方便的浏览项目的总体的目录结构和创建删除重命名文件或文件名。 在 .vimrc中的配置如下:Plugin ‘scrooloose/nerdtree’” 设置NerdTreemap <F7> :NERDTreeMirror<CR>map <F7> :NERDTreeToggle<CR>进入到 vim 后可以按 F7 显示和隐藏 NERDTree区域。gitHub的代码路径如下所示:scrooloose/nerdtree: https://github.com/scrooloose...1.4.3 majutsushi/tagbar tagbar可以将正在编辑的文件生成一个大纲视图,包含接口/方法/变量等, 可以选中快速跳转到目标位置, 编辑大文件特别有用。由于tagbar是基于ctags,需要先安装ctags:root@ubuntu:/# apt-get install ctags 在 .vimrc中的配置如下:“F9触发,设置宽度为30let g:tagbar_width = 30nmap <F9> :TagbarToggle<CR>“开启自动预览(随着光标在标签上的移动,顶部会出现一个实时的预览窗口)let g:tagbar_autopreview = 1"关闭排序,即按标签本身在文件中的位置排序let g:tagbar_sort = 0进入到 vim 后可以按 F9 开启和关闭tagbar功能 。gitHub的代码路径如下所示:majutsushi/tagbar: https://github.com/majutsushi...1.4.4 Raimondi/delimitMate delimitMate是自动补全引号(单引号/双引号/反引号), 括号(()[]{})的插件。 在 .vimrc中的配置如下:Plugin ‘Raimondi/delimitMate’gitHub的代码路径如下所示:Raimondi/delimitMate: https://github.com/Raimondi/d...GO语言调试利器——dlvvim创建程序文件自动添加头部注释附录:VIM参数设置解析set nocompatible:不要使用vi的键盘模式,而是vim自己的set number:显示行号set showcmd:输入的命令显示出来syntax on:开启语法高亮filetype on:检测文件类型 ...

December 5, 2018 · 1 min · jiezi

Linux磁盘挂载、分区、扩容操作

本文最早发布于 Rootrl’s blog注:以下操作系统环境为CentOS7基本概念在操作前,首先要了解一些基本概念磁盘在Linux系统中所有的设备都会以文件的形式存储。设备一般保存在/dev目录下面,以sda、sda1、sda2 …,sdb、sdb1…,hda,hdb。现在的设备一般都是sd命名,以前的很老的硬盘是以ha命名。sda:第一块硬盘,如果对磁盘进行了分区会有sda1(第一个分区),sda2等。sdb:第二个硬盘,同样对硬盘分区后有sdb1,sdb2等。分区分区的目的就是便于管理,比如在Windows系统我们一般会分C盘,D盘,E盘等。Linux只能创建4个主分区,如果需要创建更多的分区那么久必须创建逻辑分区,其中逻辑分区需要占用一个主分区。文件系统Linux中的文件系统也就是分区类型,在Windows中有NTEF,FAT32等,linux中常见的有Ext2、Ext3、Ext4、Linux swap、proc、sysfs、tmpfs等,可以通过mount命名查看当前已挂载的文件系统。格式化在前面创建完分区后有一步是要对分区进行格式化,其实在Windows系统中也是一样,在创建好一个分区后也需要将分区格式化,只有格式化成具体的文件类型才能使用。挂载在Windows中分区格式化后就可以使用,但是在Linux系统中必须将分区挂载到具体的路径下才可以。常用命令lsblk 查看当前磁盘情况df -lh 查看文件系统情况 -l 查看挂载点parted -l 会列出文件系统类型fdisk -l 查看当前未挂载硬盘挂载新硬盘挂载一个新硬盘基本思路是:创建分区、创建文件系统、挂载。一、查看新硬盘首先,查看硬盘状况:fdisk -l其中:如果磁盘下面有类似:Disk /dev/sdc doesn’t contain a valid partition table;或者说磁盘下面没有类似于:sdb1 sdb2 说明该磁盘未挂载这里假设看到硬盘名为 /dev/sdb二、创建分区dfisk /dev/sdb根据提示,依次输入"n",“p” “1”,两次回车,“wq"意思就是新建一个主分区(1),大小是整个sdb磁盘,然后写入。注:上述操作为了简便,只是创建一个主分区。其实一个磁盘最多有四个主分区(包括一个扩展分区),1-4都是主分区,我们也可以把一个分区作为扩展分区(通过df -lh 查看到的system为Extended)此时磁盘已经分区,但是还没有文件系统,磁盘依然不能用三、写入系统mkfs.ext4 /dev/sdb该命令会格式化磁盘并写入文件系统四、挂载比如挂载到/data下面mkdir /data # 如果存在此步省略mount /dev/sdb /data五、设置开机自动挂载以上只是临时挂载,还需设置为开机自动挂载vim /etc/fstab# 然后在内容结尾处增加一行(注意文件类型要对应):/dev/sdb /data ext4 defaults 0 0扩容关于挂载到已有目录如果你要用来挂载的目录里面并不是空的,那么挂载了文件系统之后,原目录下的东西就会暂时的消失。并不是被覆盖掉,而是暂时的隐藏了起来,等到新分割槽被卸除之后,则原目录原本的内容就会再次出来。如果要永久挂载已有目录,可以在新硬盘创建文件系统后,先挂载到一个临时目录,然后把要扩展的目录复制到这临时目录,然后删除要扩展的目录,再卸载临时挂载点,重新挂载到要扩展的目录上。举例:# 比如要扩充 /var# 在创建好文件系统后 新建临时挂载点 storagemkdir /storage# 将/dev/sdb1挂载到/storage下mount /dev/sdb1 /storage# 拷贝/var下的所有内容到新的硬盘cp -pdr /var /storage# 或在/var 目录下执行:find . -depth -print | cpio - pldvm /temp# 删除当前/var目录下的内容rm -rf /var/*# 重新挂载硬盘到/var目录umount /dev/sdb1mount /dev/sdb1 /var# 过程中若提示磁盘忙,使用fuser找出将正在使用磁盘的程序并结束掉;fuser -m -v /varfuser -m -v -i -k /var扩展如果扩容比较频繁,那推荐使用LVM管理(最后一个参考链接)参考http://www.cnblogs.com/chenmh…https://segmentfault.com/a/11...https://blog.csdn.net/wzb56_e...https://www.cnblogs.com/sourc...http://www.cnblogs.com/gaojun… ...

November 30, 2018 · 1 min · jiezi