<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:wfw="http://wellformedweb.org/CommentAPI/">
<channel>
<title>LuckyDu - Linux</title>
<link>https://blog.anlucky.cn/index.php/programming/linux</link>
<atom:link href="https://blog.anlucky.cn/index.php/feed/programming/linux" rel="self" type="application/rss+xml" />
<language>zh-CN</language>
<description>Linux,服务器,CentOs</description>
<lastBuildDate>Tue, 18 Apr 2023 13:54:00 +0800</lastBuildDate>
<pubDate>Tue, 18 Apr 2023 13:54:00 +0800</pubDate>
<item>
<title>Shell编程基础入门</title>
<link>https://blog.anlucky.cn/index.php/programming/linux/59</link>
<guid>https://blog.anlucky.cn/index.php/programming/linux/59</guid>
<pubDate>Tue, 18 Apr 2023 13:54:00 +0800</pubDate>
<dc:creator>都依凡</dc:creator>
<description><![CDATA[Shell脚本和编程1. 学习Shell的价值Linux服务器的基本操作和管理前端node.js 服务的进程管理、问题排查、资源监控等运维操作使用 shell 编写 TCE、SCM、Docker...]]></description>
<content:encoded xml:lang="zh-CN"><![CDATA[
<h1>Shell脚本和编程</h1><h2>1. 学习Shell的价值</h2><ol><li>Linux服务器的基本操作和管理</li><li>前端node.js 服务的进程管理、问题排查、资源监控等运维操作</li><li><p>使用 shell 编写 TCE、SCM、Docker 脚本，完成服务编译和部署</p><p>Linux很多指令都需要 Shell 完成</p></li></ol><h2>2. 学习环境依赖</h2><ol><li>一台安装了 Linux 系统的物理机或者云主机，可运行 Shell 脚本</li><li>本地的VScode 安装 Bash DeBug 插件，并且升级 bash 到 4.X 以上</li><li>NPM全局安装 zx 依赖</li></ol><h2>3. Shell构成</h2><p>shell官方对Shell的定义是命令行解释器，也是一门编程语言。</p><ul><li><p>Shell 作为解释器</p><ul><li>可以解释脚本和命令</li><li>同时bash 内置了命令</li><li>GNU 提供了很多工具，如： is 、mv、cat等</li><li>第三方库：社区或自己编写的一些库，如：node、Python等封装的模块</li></ul></li><li><p>Shell 作为编程语言</p><ul><li>变量：可以自定义变量、使用变量的能力</li><li>运算：可以进行逻辑运算和算数运算</li><li>语句：判断、分支、循环等编程语言具备的特点</li><li>函数：定义函数和使用函数的能力</li></ul></li></ul><h2>4. Hello Shell</h2><ol><li>在Linux中创建文件<strong>test.sh</strong></li><li>在文件中编辑如下内容</li></ol><pre><code class="lang-sh">#! /bin/bash  
echo &quot;Hello Shell!&quot;</code></pre><ul><li>代码中第一行：<strong>#! 是一个约定的标记</strong> 表示告诉系统其后路径所指定的程序即是解释此脚本文件的 Shell 程序，人们并不区分 Bourne Shell 和 Bourne Again Shell，所以，像 <strong>#!/bin/sh</strong>，它同样也可以改为 <strong>#!/bin/bash</strong>。</li><li>第二行：echo 表示输出显示打印 引号内表示要输出的语句</li></ul><h2>5. 执行 Shell 脚本</h2><p>要想执行Shell脚本，首先要看看对应的shell脚本文件是否拥有执行权限，可以使用 <strong>ll</strong> 命令查看，若没有执行权限，可以使用</p><pre><code class="lang-sh">chmod +x &lt;shell脚本文件名&gt;</code></pre><ol><li>执行脚本命令</li></ol><pre><code># 中间不可以有空格
./&lt;文件名.sh&gt;</code></pre><ol start="2"><li>执行脚本命令二</li></ol><pre><code class="lang-sh">sh &lt;shell脚本文件名&gt;</code></pre><h2>6. Shell的语法</h2><h3>1. Shell变量</h3><p><img src="http://blog.anlucky.cn/usr/uploads/2023/04/528063516.png" alt="69" title="69"></p><h3>2. declare [ + / - ] &lt;选项&gt;  &lt;变量&gt;的参数</h3><p><img src="http://blog.anlucky.cn/usr/uploads/2023/04/225429412.png" alt="55" title="55"></p><h3>3. Shell自定义变量</h3><pre><code># 变量名=变量值（等号左右不可以有空格，否则shell会当成一个命令）如：
name=&quot;张三&quot;
age=21
score=100

# 将命令复制给变量
_ls=ls

# 将命令结果赋值给变量
files=$(ls -a)

# Shell默认的数据类型是字符串，如下面代码不会进行数学运算
num=age*score

# 数学运算需要声明变量为整型
let nums=age*score

declare -i nums=age*score</code></pre><h3>4. Shell变量的使用</h3><p>在shell中使用 <strong>$</strong> 符号对已经声明的变量进行使用</p><pre><code class="lang-sh">#! /bin/bash
size=2
page_num=3

let nums=size+page_num
echo &quot;size=&quot;$size
echo &quot;page_num=&quot;$page_num
echo &quot;相加得&quot;$nums
# 输出结果 
# size=2
# page_num=3
# 相加得5</code></pre><h3>5. 系统环境变量</h3><p><img src="http://blog.anlucky.cn/usr/uploads/2023/04/528063516.png" alt="69" title="69"></p><p><strong>系统变量可以直接在linux中进行使用直接使用如：echo $HOME</strong></p><h3>6. Shell 运算符</h3><p><img src="http://blog.anlucky.cn/usr/uploads/2023/04/1863972607.png" alt="58" title="58"></p><h3>7. Shell 传递参数</h3><p>在执行Shell脚本时，可以给Shell脚本传递参数，脚本内获取参数格式为<strong>$n</strong> 其中 <strong>n</strong> 代表参数传递过来的是第几个参数，如有下面shell脚本</p><pre><code class="lang-sh">#! /bin/bash

echo &quot;第一个参数$0&quot;
echo &quot;第二个参数$1&quot;
echo &quot;第三个参数$2&quot;
echo &quot;第四个参数$3&quot;</code></pre><p>加入Shell脚本文件名为<strong>test.sh</strong>脚本执行的时候可以传参，传参方式如下：</p><pre><code class="lang-sh">sh test.sh 1 2 3 4
# 执行结果
第一个参数test2.sh
第二个参数1
第三个参数2
第四个参数3</code></pre><p>总结：</p><pre><code>我们会发现其中 $0 获取的是执行的shell文件名称，而自动忽略了第四个参数不显示，所以在Shell脚本中，若参数多的时候会忽略</code></pre><h3>8. Shell特殊字符处理参数</h3><table><thead><tr><th align="center">参数处理</th><th align="center">说明</th></tr></thead><tbody><tr><td align="center">$#</td><td align="center">传递到脚本的参数个数</td></tr><tr><td align="center">$*</td><td align="center">以一个单字符串显示所有向脚本传递的参数。 如"$*&quot;用「&quot;」括起来的情况、以&quot;$1 $2 … $n"的形式输出所有参数。</td></tr><tr><td align="center">$$</td><td align="center">脚本运行的当前进程ID号</td></tr><tr><td align="center">$!</td><td align="center">后台运行的最后一个进程的ID号</td></tr><tr><td align="center">$@</td><td align="center">与$*相同，但是使用时加引号，并在引号中返回每个参数。 如&quot;$@"用「"」括起来的情况、以"$1&quot; &quot;$2" … "$n" 的形式输出所有参数。</td></tr><tr><td align="center">$-</td><td align="center">显示Shell使用的当前选项，与set命令功能相同。</td></tr><tr><td align="center">$?</td><td align="center">显示最后命令的退出状态。0表示没有错误，其他任何值表明有错误。</td></tr></tbody></table><h4>1.Shell脚本特殊字符处理参数($*)和($@)的区别</h4><p>如：test.sh 文件中有如下代码</p><pre><code class="lang-sh">#!/bin/bash
echo &quot;-- \$* 演示 ---&quot;
for i in &quot;$*&quot;; do
    echo $i
done

echo &quot;-- \$@ 演示 ---&quot;
for i in &quot;$@&quot;; do
    echo $i
done</code></pre><p>则输出结果</p><pre><code class="lang-sh">-- $* 演示 ---
1 2 3
-- $@ 演示 ---
1
2
3</code></pre><p>我们可以从输出中看到<strong><code>$*</code></strong>会将传送的变量当作一个整体，而<strong><code>$@</code></strong>会将传输的参数散开，当成三个参数使用</p><h2>7. Shell输入输出重定向</h2><p>Shell 分为标准输入（fd0），标准输出(fd1)，标准错误输出(fd2)</p><ul><li>输出重定向符号</li></ul><table><thead><tr><th>符号</th><th>含义</th></tr></thead><tbody><tr><td>&gt;</td><td>覆盖式写入文件</td></tr><tr><td>&gt;&gt;</td><td>追加写入文件</td></tr><tr><td>2&gt;</td><td>错误输出写入文件</td></tr><tr><td>&&gt;</td><td>正确和错误输出统一写入文件中</td></tr></tbody></table><ul><li>输出重定向符号</li></ul><table><thead><tr><th>符号</th><th>含义</th></tr></thead><tbody><tr><td>&lt;</td><td> </td></tr><tr><td>&lt;&lt;</td><td> </td></tr></tbody></table><pre><code>需要注意的是文件描述符 0 通常是标准输入（STDIN），1 是标准输出（STDOUT），2 是标准错误输出（STDERR）。</code></pre><h2>8. Shell判断命令</h2><ol><li>Shell 中提供了<code>test</code> 、<code>[</code> 、<code>[[</code> 三种判断符号，可以使用到</li></ol><ul><li>整数判断</li><li>字符串测试</li><li>文件测试</li></ul><ol start="2"><li>语法：</li></ol><ul><li>test &lt;参数&gt;</li><li>[ &lt;参数&gt; ]</li><li>[[ &lt;参数&gt; ]]</li></ul><pre><code>注意：
    中括号前后要有空格符
    [ 和 `test` 命令只能使用自己支持的标志位，&lt;、&gt;、= 只能用来比较字符串，不能比较整数
    中括号内的变量，最好都使用引号括起来
    [[ 更丰富，在整形比较中，支持&lt;、&gt;、= 在字符串中支持 =~ 正则</code></pre><ol start="3"><li>测试代码</li></ol><pre><code class="lang-sh">#! /bin/bash
# 整数测试
test $n1 -eq $n2 # 两个整数变量等于
test $n1 -lt $n2 # 两个整数变量小于
test $n1 -gt $n2 # 两个整数变量大于

# 字符串测试
test -z $str # 判断字符串为空 -z
test -n $str # 判断字符串非空 -n
test $ str1 = $str2 # 判断字符串相等 =

# 文件测试
test -e /dmt &amp;&amp; echo &quot;exist&quot; # 文件是否存在 -e
test -f /usr/bin/npm &amp;&amp; echo &quot;file exist&quot; # 文件是否存在，并且是一个普通文件</code></pre><h2>9. Shell 条件判断</h2><pre><code class="lang-sh">if &lt;条件&gt;
then
    代码块
elif &lt;条件&gt;
then
    代码块
else
    代码块
fi</code></pre><p>判断两个变量是否相等</p><pre><code class="lang-sh">a=10
b=20
if [ $a == $b ]
then
   echo &quot;a 等于 b&quot;
elif [ $a -gt $b ]
then
   echo &quot;a 大于 b&quot;
elif [ $a -lt $b ]
then
   echo &quot;a 小于 b&quot;
else
   echo &quot;没有符合的条件&quot;
fi</code></pre><p>如果使用    ((.....))</p><pre><code class="lang-sh">a=10
b=20
if (( $a == $b ))
then
   echo &quot;a 等于 b&quot;
elif (( $a &gt; $b ))
then
   echo &quot;a 大于 b&quot;
elif (( $a &lt; $b ))
then
   echo &quot;a 小于 b&quot;
else
   echo &quot;没有符合的条件&quot;
fi</code></pre><h2>10.Shell函数</h2><ul><li>语法一</li></ul><pre><code class="lang-sh">funName(){
    方法体
}</code></pre><ul><li>语法二</li></ul><pre><code class="lang-sh">function funName(){
    方法体
}</code></pre><p>使用方法：</p><pre><code class="lang-sh">function add(){
    let sum=$1+$2
    echo sum
}
# 调用方式
* add 1 2
# 是不需要写括号的</code></pre><p><strong>在Shell中是不需要声明参数的，在方法内使用$进行参数获取</strong></p><p>注意：</p><ul><li>Shell 是自上而下执行的，函数定义在前，使用在后</li><li>函数获取变量和 Shell script类似，$0 代表函数名称</li><li>函数内return 仅仅表示函数的执行状态，不代表函数的执行结果</li><li>返回结果一般使用<code>echo</code>、<code>printf</code>，在外边使用<code>$()</code>、``获取结果</li><li>如果没有 return 函数的状态是上一条命令的执行状态，存储在<code>$?</code></li></ul><h2>11. 模块化</h2><p>模块化的原理是在当前的Shell内执行函数文件，引入方式：<code>suorce [函数库的路径]</code></p><p>如，现在有文件test1.sh</p><pre><code class="lang-sh">#! /bin/bash
function add(){
    let sum=$1+$2
    echo $res
}</code></pre><p>有第二个文件main.sh</p><pre><code class="lang-sh">#! /bin/bash
source &#039;./math.sh&#039;
sum=$(add 1 2)
echo $sum</code></pre><h2>12. Shell脚本的执行过程</h2><ol><li><p>字符解析</p><ul><li>识别换行符，分号，做行的分割</li><li>识别命令连接符（|| 、&&、 管道）做命令的分割</li><li>识别空格，tab符号，做命令和参数的分割</li></ul></li><li>Shell 展开，如：{1..3} 解析为 1 2 3 后面会详细说</li><li>重定向，将标准文件的输入输出进行指向的变更</li><li><p>执行命令</p><ul><li>内置命令会在当前进程直接执行</li><li>非内置命令会使用$PATH 查找，然后启动子进程执行</li></ul></li><li>手机状态并返回</li></ol><h2>13. Shell 展开</h2><h3>1. 大括号展开</h3><p>一般由三部分构成，前缀、一对大括号，后缀，大括号内可以是逗号分割的字符串序列,也可以是序列表达式</p><pre><code class="lang-sh"># 字符序列
a{b,c,d}e 展开结果=&gt; abe ace ade
# 表达式序列 （数字可以使用..调整增量，字母不能调整增量）
{1..5}  =&gt;  1 2 3 4 5

{1..5..2}  =&gt; 1 3 5

{a..e}   =&gt;  a b c d e</code></pre><h3>2. 波浪号展开</h3><p>波浪号会将当前替换成当前用户主目录的值</p><pre><code class="lang-sh">~  展开是 # $HOME就是用户目录 

~root  =&gt;  # root指定用户的目录

~+    =&gt; # 当前工作目录

~-    =&gt;  # 上一个工作目录</code></pre><h3>3. 大括号展开</h3><ol><li>间接参数扩展<code>${!parameter}</code>，其中应用的并不是parameter 而是 parameter的实际值</li></ol><pre><code class="lang-sh">parameter=&quot;var&quot;
var=&quot;hello&quot;
echo ${!parameter}
# 首先会将parameter转换成var
# 其次${var}的值是hello
# 所以最后输出的值是 hello</code></pre><ol start="2"><li>参数长度 ${parameter}</li></ol><p>输出parameter的长度</p><pre><code class="lang-sh">par=cd
echo ${#par} 
# 输出 2</code></pre><ol start="3"><li><p>空参数处理</p><ol><li>${parameter:-word}  为空替换 判断parameter的值是否为空，为空使用word替换</li><li>${parameter:=word} 为空替换，判断parameter的值是否为空，为空将parameter的值赋值为word</li><li>${parameter:?word} 为空报错</li><li>${parameter:+word} 不为空替换</li></ol></li></ol><p>如，有下面Shell脚本</p><pre><code class="lang-sh">a=1
echo ${a:-wrod} # 1

echo ${b:-wrod} # word

echo ${par:=wrod} # word

echo ${par:-hello} # word 因上一条语句已经赋值为word,所以不为空，所以输出结果还是word

echo ${a:+foo} # foo</code></pre><ol start="4"><li>参数切片</li></ol><p>${parameter:offset}</p><p>${parameter:offset:lenth}</p><ol start="5"><li><p>参数部分删除，对字符掐头去尾的操作</p><ol><li>${parameter%word} # 最小限度从后面截取word</li><li>${parameter%%word} # 最大限度从后面截取word</li><li>${parameter#word} # 最小限度从前面截取word</li><li>${parameter##word} # 最大限度从前面截取word</li></ol></li></ol><pre><code class="lang-sh">#！ /bin/sh
str=abcdefg

sp1=${str##*d}

sp2=${str%%d*}

echo $sp1 # 输出efg

echo $sp2 # 输出abc</code></pre><h2>14. Shell脚本VScode好用插件推荐</h2><ol><li>Shellman ：代码提示和自动补全</li><li>shellcheck：代码语法校验</li><li>shell-format : 代码格式化</li><li><p>Bash Debug 支持单步调试</p><ol><li>首先要安装vscode插件</li><li>编写launch.json文件</li><li>升级bash到4.x以上的版本</li></ol></li></ol>
]]></content:encoded>
<slash:comments>0</slash:comments>
<comments>https://blog.anlucky.cn/index.php/programming/linux/59#comments</comments>
<wfw:commentRss>https://blog.anlucky.cn/index.php/feed/programming/linux</wfw:commentRss>
</item>
<item>
<title>Linux基础入门</title>
<link>https://blog.anlucky.cn/index.php/programming/linux/17</link>
<guid>https://blog.anlucky.cn/index.php/programming/linux/17</guid>
<pubDate>Sun, 16 Apr 2023 17:19:00 +0800</pubDate>
<dc:creator>都依凡</dc:creator>
<description><![CDATA[1. Linux的学习价值Linux是现代化应用程序交付的首选平台，无论是部署在裸机，虚拟化还是容器化环境公司内部服务（TCE、Faas、SCM）统一使用Debian Linux系统熟悉Linu...]]></description>
<content:encoded xml:lang="zh-CN"><![CDATA[
<h2>1. Linux的学习价值</h2><ul><li>Linux是现代化应用程序交付的首选平台，无论是部署在裸机，虚拟化还是容器化环境</li><li>公司内部服务（TCE、Faas、SCM）统一使用Debian Linux系统</li><li>熟悉Linux基础指令，就可以熟悉运维前端常用服务，如Nginx，Node.js</li></ul><h2>2. Linux为什么选择企鹅作为Logo</h2><p>企鹅是南极洲的标志性动物，根据国际公约，南极洲为全人类共同所有，不属于当今世界的任何一个国家，所以Linux选择企鹅作为标志，其含义也在表明：开源的Linux为全人类共同所有，任何公司无权将其私有，也就是大家可以在任何场合公开使用Linux系统</p><h2>3. 计算机硬件</h2><h3>1. 计算机由五大基本单元</h3><ul><li>控制器</li></ul><pre><code>控制器的作用：顾名思义就是指挥控制计算器其他部件运行工作的部件</code></pre><ul><li>运算器</li></ul><pre><code>运算器的作用：主要作用是来进行我们的算数运算和逻辑运算，常规意义下我们会将控制器和运算器组成我们所说的CPU单元</code></pre><ul><li>存储单元</li></ul><pre><code>存储单元分为外存和内存：
    外存：外存比如我们的磁盘，光驱，都是属于外存
    
    内存：电脑的运行内存</code></pre><ul><li>输入单元</li></ul><pre><code>输入单元的作用：输入单元如我们的鼠标，键盘，都是输入单元</code></pre><ul><li>输出单元</li></ul><pre><code>输出单元的作用：输出单元比如显示器，音响，就是输出单元</code></pre><h3>2. 五大基本单元的工作方式</h3><p>计算机通过输入设备，输入指令，如键盘 / 鼠标输入，然后计算机会通过控制器、运算器、存储器之间相互配合工作，将我们工作的结果通过输出设备输出显示</p><h2>4. 操作系统</h2><h3>1. 操作系统介绍</h3><pre><code>操作系统用于管理和控制计算机系统中的硬件和软件资源，用于在用户与系统硬件之间传递信息
简单理解：
    操作系统就是一个承上启下的作用，承上就是在我们操作系统之上，可以运行我们的应用程序，启下，就是在我们操作系统之下，可以通过我们的计算机硬件配合去做一些事情</code></pre><p>总结来说，计算机操作系统为我们提供了两大能力，管理计算机资源和提供用户接口</p><ul><li>管理计算机资源</li></ul><p>比如：处理器管理，存储器管理，设备管理，文件管理</p><ul><li>提供用户接口</li></ul><p>比如：命令接口、图形用户接口、程序接口</p><p>我们常见的操作系统，如：MacOs，Linux，Windows，Android，鸿蒙Os</p><h3>2. 操作系统启动流程</h3><ul><li>基于BIOS 和 基于UEFI</li></ul><p>BIOS启动流程：</p><ol><li>BIOS启动</li><li>BIOS自检</li><li>BootLoader 操作系统引导程序</li><li>OS  （指的是相应的操作流程）</li></ol><p>UEFI启动流程</p><ol><li>UEFI启动</li><li>BootLoader</li><li>OS</li></ol><p>现如今主流的启动方式是UEFI启动</p><ul><li>操作系统如何做到在电脑通电后进入操作启动流程？</li></ul><pre><code>可以简单的理解为BIOS或者UEFI是固化在电脑主板上的一段程序，在电脑通电之后会固定执行响应这一段执行</code></pre><h3>3.BIOS启动和UEFI启动的区别</h3><p>可以简单的理解为UEFI启动方式是BIOS启动方式的升级版本，因为BIOS启动的时候会进行一系列的自检，这就会导致我们的运行速度变慢，而UEFI是直接优化了这一段程序，使得启动的速度会更快，还有就是BIOS无法启动2.2T以上容量的磁盘</p><h2>5. 查询Linux版本</h2><h3>1.查询内核版本</h3><ul><li>方法一</li></ul><pre><code>uname -a</code></pre><p><img src="http://blog.anlucky.cn/usr/uploads/2023/04/4096999605.png" alt="27" title="27"></p><ul><li>方法二</li></ul><pre><code>cat /proc/version</code></pre><p><img src="http://blog.anlucky.cn/usr/uploads/2023/04/3296446612.png" alt="28" title="28"></p><h3>2. 查询发行版本</h3><pre><code>cat /etc/os-release</code></pre><p><img src="http://blog.anlucky.cn/usr/uploads/2023/04/2995283207.png" alt="29" title="29"></p><h3>3. 发行版本和内核版本的区别</h3><ul><li>内核版本就是由Linux作者团队来维护的Linux最核心的部分</li><li>发行版本就是在内核版本的基础上加上了许多应用程序的版本，如：CentOs，Debian，Ubantu</li></ul><h2>6. Linux系统应用领域</h2><p>主要的应用领域</p><ol><li>IT服务器（操作系统、虚拟化和云计算）</li><li>嵌入式和智能设备</li><li>个人办公桌面</li><li>学术研究与软件研究</li></ol><p>因为Linux是完全开源的，所以在Linux的基础上可以进行开发，和办公</p><h2>7. Linux基本组成</h2><p>Linux系统一般有4个主要部分</p><ol><li>内核</li></ol><pre><code>一般是操作系统的内核，如线程管理，内存管理</code></pre><ol start="2"><li>shell</li></ol><pre><code>命令解释器，输入一些命令，以至于可以使用Linux内核中的一些资源</code></pre><ol start="3"><li>文件系统</li></ol><pre><code>负责管理文件管理，将用户的文件存储到磁盘上</code></pre><ol start="4"><li>应用程序</li></ol><pre><code>应用程序最好理解，比如在Linux所使用的VSCode,就是应用程序</code></pre><h2>8.查询进程命令</h2><h3>1. 查询某个应用程序的进程</h3><pre><code>ps -ef | grep &lt;应用名称&gt;
如：要查询nginx进程使用如下命令：
ps -ef | grep nginx</code></pre><h3>2. 查询某个进程的详细信息</h3><pre><code>top -p &lt;进程ID&gt;
可以查到CPU占用等信息，查询1432进程的信息：
top -p 1432</code></pre><h3>3. 关闭指定进程</h3><pre><code>kill &lt;进程IP&gt;
# 如关闭1432进程
kill 1432</code></pre><h3>4. 显示所有进程的动态列表</h3><pre><code>top</code></pre><p><img src="http://blog.anlucky.cn/usr/uploads/2023/04/1591947124.png" alt="30" title="30"></p><h2>9. 进程调度</h2><h3>1.系统中运行的程序远远大于CPU的核数，那么Linux系统是如何实现同时运行这么多的程序的？</h3><p>通过进程调度</p><p>进程调度是指操作系统按某种策略或者规则选择进程占用CPU进行运行的过程。</p><p>简单理解为：</p><pre><code>CPU会通过某种策略，在一个线程执行多少时间后去执行另外的线程以此切换执行，因速度非常快，所以给人的感觉是同时运行着，当然这种策略远不止像描述的这样简单，这里只是做一个简单的比喻</code></pre><h3>2. 进程调度的原则</h3><ul><li>一个CPU核在同一时间，只能运行一个进程</li><li>每个进程有近乎相等的执行时间</li><li>对于逻辑CPU而言，进程调度使用轮询方式执行，当轮询完成则回到第一个进程反复</li><li>进程执行消耗时间和进程量成正比</li></ul><h2>10.Linux的文件系统</h2><p>文件系统是操作系统中负责管理持久数据的子系统，负责把用户的文件存到磁盘硬件中，持久化的保存文件</p><p><strong>在Linux中，一切皆文件</strong></p><p>在Linux中，文件系统是采用树状的目录结构，最上层目录是根目录（ / ）</p><p><img src="http://blog.anlucky.cn/usr/uploads/2023/04/1649689202.png" alt="31" title="31"></p><h3>1. 虚拟文件系统</h3><ul><li><p>问题？</p><ul><li>Linux中有这么多不同的文件系统，如何实现对用户统一调用接口的？</li></ul></li></ul><pre><code>Linux在中间层做了一个接口抽象（VFS 虚拟文件系统）
* 对应层提供一个标准文件操作接口，如读取，写入
* 对文件系统提供一个标准文件接入接口</code></pre><h3>2. 查询文件系统类型命令</h3><pre><code># 可以查看到文件系统磁盘空间利用率
df -T</code></pre><p><img src="http://blog.anlucky.cn/usr/uploads/2023/04/3903662040.png" alt="32" title="32"></p><h3>3. 文件的基本操作</h3><ul><li>查看文件夹下的内容</li></ul><pre><code>ls # 可以遍历出文件夹的所有文件列表</code></pre><ul><li>创建文件夹</li></ul><pre><code>mkdir &lt;文件夹名称&gt;</code></pre><ul><li>移动文件</li></ul><pre><code>mv &lt;demo&gt; &lt;home&gt; # 将demo 文件/ 文件夹移动到home的位置，home移动时可以修改文件名</code></pre><ul><li>删除文件</li></ul><pre><code>rm -r &lt;文件名&gt;</code></pre><ul><li>创建文件</li></ul><pre><code>touch &lt;文件名&gt;</code></pre><ul><li>复制文件</li></ul><pre><code>cp &lt;demo1&gt; &lt;demo1_bak&gt; # 将demo1文件复制一份并修改名称为demo1_bak</code></pre><h2>11.Linux用户权限</h2><p>在Linux中用户包括两部分</p><ul><li><p>用户账户</p><ul><li>普通用户账户：在系统中进行普通作业(普通用户账户)</li><li>超级用户账户：在系统中对普通用户和整个系统进行管理（root）</li></ul></li><li><p>组账户</p><ul><li>标准组：可以容纳多个用户</li><li>私有组：只有用户自己</li></ul></li></ul><h3>1. 查看用户信息命令</h3><pre><code>w # 这个命令可以查看当前登录的用户</code></pre><p><img src="http://blog.anlucky.cn/usr/uploads/2023/04/1085704076.png" alt="33" title="33"></p><pre><code>groups # 查看当前用户所属的组
# 一个用户可以属于多个组</code></pre><p><img src="http://blog.anlucky.cn/usr/uploads/2023/04/3848314876.png" alt="34" title="34"></p><pre><code>查看用户的uid信息
id &lt;用户名&gt;</code></pre><p><img src="http://blog.anlucky.cn/usr/uploads/2023/04/2727041756.png" alt="35" title="35"></p><h3>2. 用户文件权限</h3><p>对于用户文件权限中有三个概念</p><p>所有者：文件的所有者，拥有所有权</p><p>所在组：文件所有者所在的组</p><p>其他人：除文件所有者及所在组外的其他人</p><p>每个用户对用文件都有不同权限，包括：R（读-4） W （写-2）X（执行-1）</p><p><img src="http://blog.anlucky.cn/usr/uploads/2023/04/2607770961.png" alt="36" title="36"></p><p>如此图：</p><p>​    文件的类型为：文件夹</p><p>​    所有者拥有：读写执行的权限</p><p>​    所在的组拥有：读和执行的权限</p><p>​    其他人拥有：读和执行的权限</p><h3>3. 创建用户</h3><pre><code>sudo useradd &lt;用户名&gt;  # 创建一个用户
sudo passwd &lt;用户密码&gt; # 创建用户登录密码</code></pre><h3>4. 切换用户</h3><pre><code>su &lt;用户名&gt;</code></pre>
]]></content:encoded>
<slash:comments>0</slash:comments>
<comments>https://blog.anlucky.cn/index.php/programming/linux/17#comments</comments>
<wfw:commentRss>https://blog.anlucky.cn/index.php/feed/programming/linux</wfw:commentRss>
</item>
</channel>
</rss>