【Linux】进程和计划任务管理

article/2025/2/6 3:10:18

文章目录

  • 一、线程、进程、程序的概念
    • 什么是程序?
    • 什么是线程?
    • 什么是进程?
    • 线程与进程的关系
    • 线程与进程的区别
    • 程序与进程的区别
  • 二、查看进程的方式
    • 查看静态的进程统计信息——ps
      • ps -aux命令
      • ps -elf命令
      • ps查看线程命令
    • 过滤查询——grep
    • 查看动态的进程排名信息——top
      • top常用命令
      • top查看线程命令
      • 常见load字段相关问题
    • 根据特定条件查看进程PID信息——pgrep
    • 以树形结构列出进程信息——pstree
  • 三、进程的启动与控制
    • 1、手动启动
      • nohup命令——终端关闭后任务依旧启动
    • 2、进程的前后台调度
      • Ctrl + Z 组合键
      • jobs命令
      • fg命令
    • 3、终止程序的运行
      • Ctrl + C组合键
      • kill命令
      • killall命令
      • pkill命令
  • 四、计划任务管理
    • 设置一次性计划任务——at命令
    • 设置周期性计划任务——crontab命令


一、线程、进程、程序的概念

什么是程序?

  程序是保存在硬盘、光盘等介质中的可执行代码和数据,它是在文件中静态保存的代码。通常可以理解为程序员写的代码,代码保存在文件中,存储在硬盘里面。

什么是线程?

  线程是CPU调度的最小单位(程序执行流的最小单元),它被包含在进程之中,是进程中的实际运作单元。一条线程是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。

  一个线程可与同属一个进程的其他线程共享进程所拥有的全部资源,所以线程和其同属的进程共用一个PID。由于线程之间的相互制约,致使如果同进程中的一个线程出现故障,那么其他的线程都会挂掉。

什么是进程?

  进程是指在系统中正在运行的一个应用程序,程序一旦运行就是进程。

  进程是在CPU及内存中运行的程序代码,因此是动态执行的代码。进程是系统进行资源分配的独立实体, 且每个进程拥有独立的地址空间,即每个进程的PID号不同。根据程序的不同需求有父子进程,所有每个程序可以创建一个或多个进程。

线程与进程的关系

  1. 一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程;

  2. 资源分配给进程,同一进程内的所有线程共享该进程的所有资源;

  3. 线程在执行过程中需要协作同步。不同进程中的线程之间要利用消息通信的方法实现同步;

  4. 处理机分配给线程,即真正在处理机上运行的是线程;

  5. 线程是进程的一个执行单元,也是进程内的可调用实体。

在这里插入图片描述

线程与进程的区别

  1. 线程共享内存空间;进程的内存是独立的;

  2. 同一个进程的线程之间可以直接交流;两个进程想通信,必须通过一个中间代理来实现;

  3. 创建新进程很简单;创建新线程需要对其父进程进行一个克隆;

  4. 一个线程可以控制和操作同一进程里的其他线程;但是进程只能操作子进程;

  5. 改变注线程(如优先权),可能会影响其他线程;改变父进程,不影响子进程。

  6.调度:线程作为分配和调度的基本单位,进程作为拥有资源的基本单位

  7.并发性:不进进程之间可以并发执行,同一进程内的线程也可以并发执行

  8.拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但是可以访问隶属于进程的系统资源

  9.系统开销:在创建和撤销进程的时候,系统都要分配和回收资源,导致系统的明显大于创建和撤销线程时的开销。但进程有独立的地址空间,进程崩溃后,在保护模式的下不会对其他进程造成影响,而线程只是进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有独立的地址空间,一个线程死后就等于整个进程死掉,所以多进程程序要比多线程程序健壮,但是在进程切换的时候消耗的资源较大,效率差。

  总结:多线程执行效率高; 多进程耗资源,安全。

程序与进程的区别

  1. 程序是数据和指令的集合, 是一个静态的概念, 就是一堆代码, 可以长时间的保存在系统中;

  2. 进程是程序运行的过程, 是一个动态的概念, 进程存在着生命周期, 也就是说进程会随着程序的终止而销毁, 不会永久存在系统中。

二、查看进程的方式

查看静态的进程统计信息——ps

ps -aux命令

常用命令格式

ps -aux

常用选项及其含义

选项含义
-a显示终端上的所有进程,包括其它用户的进程。
-u表示列出进程的用户。
-x显示所有终端的进程。

其中-可加可不加,效果相同。

基本使用方式以及相关字段含义

[root@host ~]# ps -aux
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root        232  1.2  0.4  68292 17836 ?        R    15:49   0:00 @usr/sbin/

  root:USER,进程的用户。

  232:PID,进程的ID。

  1.2:%CPU,进程占用的CPU百分比。

  0.4:ME1M,占用内存的百分比。

  68292:VSZ,该进程使用的虚拟内存量(KB) 。

  17836:RSS,该进程占用的物理内存量(KB) 。

  ?:TTY,启动进程的终端名。不是从终端启动的进程则显示为?

  R:STAT,该进程的状态(D:不可中断的休眠状态。R:正在运行状态﹔S:处于休眠状态,可被唤醒,T:停止状态,可能是在后台暂停或进程处于跟踪调试状态。Z:僵尸进程,进程已经中止,但是部分程序还在内存当中)。

  15:49:START,该进程被触发启动时间。

  0:00:TIME,该进程实际使用CPU运行的时间。

  @usr/sbin/:COMMAND,进程的启动命令,可以用绝对路径来表示。

排序显示进程状态

ps aux --sort -%cpu | head -10	按cpu降序排列,-为降序,+为升序,p与%同义
ps aux --sort +pmem | head -n 10	按内存升序排列
ps aux --sort -pcpu,+pmem | head -n 10

僵尸进程出现的原因

  一个进程结束了,但是如果该进程的父进程已经先结束了,那么该进程就不会变成僵尸进程,因为每个进程结束的时候,系统都会扫描当前系统中所运行的所有进程,看有没有哪个进程是刚刚结束的这个进程的子进程,如果是的话,就由init来接管它,成为它的父进程,子进程退出后init会回收其占用的相关资源。

  但是当子进程比父进程先结束,而父进程又没有回收子进程,释放子进程占用的资源,此时子进程将成为一个僵尸进程。

ps -elf命令

基本命令格式

ps -elf
ps -ef

常用选项及其含义

选项含义
-e显示系统内的所有进程信息。
-l使用长格式显示进程信息。
-f使用完整的格式显示进程信息。

其中-必须要加。

使用方式以及相关字段含义

[root@host ~]# ps -elf
F S UID         PID   PPID  C PRI  NI ADDR SZ WCHAN  STIME TTY          TIME CMD
4 S root          1      0  0  80   0 - 48443 ep_pol 15:49 ?        00:00:02 /usr/lib/systemd/systemd --switched-root --system --deserialize 22

  4:F,内核分配给进程的系统标记。

  S:S,进程的状态(D:不可中断的休眠状态。R:正在运行状态﹔S:处于休眠状态,可被唤醒,T:停止状态,可能是在后台暂停或进程处于跟踪调试状态。Z:僵尸进程,进程已经中止,但是部分程序还在内存当中)。

  root:UID,启动这些进程的用户。

  1:PID,进程的进程ID。

  0:PPID,父进程的进程号(如果该进程是由另一个进程启动的)。

  0:C,进程生命周期中的CPU利用率。

  80:PRI,进程的优先级(越大的数字代表越低的优先级)。

  0:NI,谦让度值用来参与决定优先级。

  -:ADDR,进程的内存地址。

  48443:SZ,假如进程被换出,所需交换空间的大致大小。

  ep_pol:WCHAN,若该进程在睡眠,则显示睡眠中的系统函数名。

  15:49:STIME,进程启动时的系统时间。

  ?:TTY,进程启动时的终端设备。

  00:00:02:TIM,运行进程需要的累计CPU时间。

  /usr/lib/systemd/systemd --switched-root --system --deserialize 22:CMD,进程的启动命令。

ps查看线程命令

基本命令格式

//显示所有线程
ps -aT //查看指定进程中已经起的线程,即查看某个线程
ps -T -p <pid>//查看指定进程中的线程信息
ps -L <pid>

过滤查询——grep

由于系统中运行的进程数量较多,需要查询某一个进程的信息时可以结合管道操作和grep命令进行过滤。

基本使用方式

[root@host ~]# ps -aux | grep bash
root        701  0.0  0.0 115408   948 ?        S    15:56   0:00 /bin/bash/usr/sbin/ksmtuned
root       3788  0.0  0.0 116752  3288 pts/0    Ss   18:23   0:00 -bash
root       4263  0.0  0.0 112828   972 pts/0    S+   19:06   0:00 grep --color=auto bash

查看动态的进程排名信息——top

基本命令格式

top

使用方式以及相关字段含义

[root@host ~]# top
top - 16:50:56 up 1:01, 1 user, load average: 0.00, 0.01, 0.05
Tasks: 157 total, 1 running, 156 sleeping, 0 stopped,0 zombie
%Cpu(s): 0.2 us, 0.0 sy, 0.0 ni, 99.8 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 3861300 total, 2837720 free, 610816 used, 412764 buff/cache
KiB Swap: 4194300 total, 4194300 free,      0 used. 2993320 avail MemPID USER	PR	NI	VIRT	RES	  SHR S	%CPU %MEM    TIME+  COMMAND
1   root    20   0 193772  6928  4184 S 0.0  0.2   0:02.04  systemd
...

默认情况下每5秒刷新一次

第一行是任务队列信息

top - 16:50:56 up 1:01, 1 user, load average: 0.00, 0.01, 0.05

  16:50:56:系统时间。

  up 1:01 :系统己运行时长。

  1 user:当前登录用户数。

  load average: 0.00, 0.01, 0.05: 系统负载,即单位时间内系统处理的任务数,后面三个数值分别为1分钟、5分钟、15分钟前到现在的平均值。

第二行为进程信息

Tasks: 157 total, 1 running, 156 sleeping, 0 stopped,0 zombie

  Tasks:总进程数

  running : 正在运行的进程数

  sleeping:休眠的进程数

  stopped:中止的进程数

  zombie:僵死的进程数

第三行为CPU的信息

%Cpu(s): 0.2 us, 0.0 sy, 0.0 ni, 99.8 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st

默认显示所有CPU的平均使用情况,如果系统有多个CPU,想查看每个CPU的使用情况,可以按数字”1“,调出所有的CPU。

  us:用户占用

  sy:内核占用

  ni:优先级调度占用

  id:空闲CPU,要了解空闲的CPU百分比,主要看%id部分

  wa:I/O等待占用

  hi:硬件中断用

  si:软件中断占用

  st:虚拟化占用

第四行为内存的信息

KiB Mem : 3861300 total, 2837720 free, 610816 used, 412764 buff/cache

  total:总内存空间

  free:空闲内存

  used:己用内存

  buff/cache:物理内存和交换内存的缓冲区总和

第五行为交换空间的信息

KiB Swap: 4194300 total, 4194300 free,      0 used. 2993320 avail Mem

  total: 总交换空间

  free:空闲交换空间

  used:己用交换空间

  avail Mem:可用物理空间

进程信息区各列解释:

PID USER	PR	NI	VIRT	RES	  SHR S	%CPU %MEM    TIME+  COMMAND
1   root    20   0 193772  6928  4184 S 0.0  0.2   0:02.04  systemd

  PID:进程id

  USER:进程所有者的用户名

  PR:优先级

  NI:让度值。负值老示高优先级,正值表示低优先级

  VIRT:进程使用的虚拟内存总量,单位kb

  RES:进程使用的物理内存总量,单位kb

  SHR:共享内存大小,单位kb

  S :进程状态

  %CPU:上次更新到现在的CPu时间占用百分比

  %MEM:进程使用的物理内存百分比

  TIME+: 进程使用的CPU时间总计,单位1/100秒

  COMMAND:命令名/命令行

top常用命令

命令含义
P键根据CPU使用百分比大小进行排字
M键根据驻留内存大小进行排字
N键根据启动时间进行排序
c键切换显示命令名称和完整命令行
h键可以获得top程序的在线帮助信息
1键显示CPU个数(是数字中的1,而不是字母l)
k键根据提示输入指定进程的PID号并按Enter键终止对应的进程
q键退出top程序

top查看线程命令

基本命令格式

//显示所有线程
top-H
//显示特定进程中的线程,即查看某个线程
top -H -p <pid>

常见load字段相关问题

如何查询load average字段的命令

top命令、w命令、uptime命令

如何判断load average字段的数字是否异常

  CPU的平均负载和当前系统的CPU数量有关,如果系统是2核,而平均值在2或以上,说明CPU一直处于高负荷运行,即平均值是根据CPU数量而决定的。通常值在70%以下输入正常的,如果长时间高于 80%或者85%就属于异常。

CPU使用率高,但是找不到进程占用(CPU使用率高,负载(Load)很高)

  产生的原因一句话总结就是:一个进程因配置问题等错误启动失败,但是被监控系统(supervisor)自动重启。而这个进程就是“短时进程”,也就是在其它应用内部调用exec执行外部命令,这些命令一般执行时间很多,但通过top,pidstat都很难发现,这就导致了负载过大,并且CPU使用率高。

  1. 首先我们通过top查看user CPU使用量,已经达到80%,但是看不到哪个进程占用;
  2. 然后通过pidstat查看CPU进程,也没有找到占用CPU使用量高的进程;
  3. 然后我通过vmstat查看r列活跃进程数,发现已经有超过CPU个数的活跃进程占用CPU;
  4. 通过ps aux | grep R查看活跃进程,执行多次可以发现多个“短时进程"启动停止;
  5. perf record -g, perf report 抓CPU性能事件,发现很多相同"短时进程"每个进程占用CPU不对,但是进程比较多;
  6. pstree | grep "短时进程名称"来分析是哪个进程制造的"短时进程”,需要对这个进程进行代码分析;
  7. 可以定位为"短时进程"进程过多导致user CPU使用率升高,因为进程启动结束时间较短,所以toppidstat不容易发现;
  8. 假如抓取"短时进程"可以使用execSnoop工具,它通过frace实时监控进程的exec()行为,并输出"短时进程"的基本信息,PID,父进程PID。

”CPU使用率低,负载(Load)很高“分析方法

  产生的原因一句话总结就是:等待磁盘I/O完成的进程过多,导致进程队列长度过大,但是CPU运行的进程却很少,这样就体现到负载过大了,CPU使用率低。

  1. 通过top命令查看CPU等待IO时间,即%wa
  2. 通过iostat -d -x -m 1 10查看磁盘IO情况;(安装命令 yum install -y sysstat)
  3. 通过sar -n DEV 1 10查看网络IO情况;
  4. 通过如下命令查找占用IO的程序

ps -e -L h o state,cmd  | awk '{if($1=="R"||$1=="D"){print $0}}' | sort | uniq -c | sort -k 1nr

根据特定条件查看进程PID信息——pgrep

基本命令格式

pgrep <选项>  <参数>

常见选项及含义

选项含义
-l显示进程名,缺省时只输出PID号
-U指定特定用户
-t指定终端

基本使用方式

[root@host ~]# pgrep -l "log"
299 xfs-log/sda2
605 systemd-logind
613 abrt-watch-log
616 abrt-watch-log
1046 rsyslogd

以树形结构列出进程信息——pstree

基本命令格式

pstree [选项] [参数]
pstree

常用选项及含义

选项含义
-a显示完整信息
-u列出对应的用户名
-p列出对应PID号

基本使用方式

查看所有进程的信息

[root@host ~]# pstree
systemd─┬─ModemManager───2*[{ModemManager}]├─NetworkManager───2*[{NetworkManager}]├─VGAuthService├─2*[abrt-watch-log]├─abrtd├─accounts-daemon───2*[{accounts-daemon}]├─at-spi-bus-laun─┬─dbus-daemon───{dbus-daemon}│                 └─3*[{at-spi-bus-laun}]├─at-spi2-registr───2*[{at-spi2-registr}]├─atd├─auditd─┬─audispd─┬─sedispatch│        │         └─{audispd}│        └─{auditd}├─avahi-daemon───avahi-daemon├─boltd───2*[{boltd}]├─chronyd├─colord───2*[{colord}]├─crond├─cupsd├─2*[dbus-daemon───{dbus-daemon}]├─dbus-launch├─dnsmasq───dnsmasq├─firewalld───{firewalld}├─gdm─┬─X───3*[{X}]│     ├─gdm-session-wor─┬─gnome-session-b─┬─gnome-shell─┬─ibus-daem+│     │                 │                 │             └─14*[{gnom+│     │                 │                 ├─gsd-a11y-settin───3*[{g+│     │                 │                 ├─gsd-clipboard───2*[{gsd+│     │                 │                 ├─gsd-color───3*[{gsd-col+│     │                 │                 ├─gsd-datetime───2*[{gsd-+│     │                 │                 ├─gsd-housekeepin───2*[{g+│     │                 │                 ├─gsd-keyboard───3*[{gsd-+│     │                 │                 ├─gsd-media-keys───3*[{gs+│     │                 │                 ├─gsd-mouse───2*[{gsd-mou+│     │                 │                 ├─gsd-power───3*[{gsd-pow+│     │                 │                 ├─gsd-print-notif───2*[{g+│     │                 │                 ├─gsd-rfkill───2*[{gsd-rf+│     │                 │                 ├─gsd-screensaver───2*[{g+│     │                 │                 ├─gsd-sharing───3*[{gsd-s+│     │                 │                 ├─gsd-smartcard───4*[{gsd+│     │                 │                 ├─gsd-sound───3*[{gsd-sou+│     │                 │                 ├─gsd-wacom───2*[{gsd-wac+│     │                 │                 ├─gsd-xsettings───3*[{gsd+│     │                 │                 └─3*[{gnome-session-b}]│     │                 └─2*[{gdm-session-wor}]│     └─3*[{gdm}]├─gssproxy───5*[{gssproxy}]├─ibus-portal───2*[{ibus-portal}]├─ibus-x11───2*[{ibus-x11}]├─irqbalance├─ksmtuned───sleep├─libvirtd───16*[{libvirtd}]├─lsmd├─lvmetad├─master─┬─pickup│        └─qmgr├─packagekitd───2*[{packagekitd}]├─polkitd───6*[{polkitd}]├─pulseaudio───{pulseaudio}├─rngd├─rpcbind├─rsyslogd───2*[{rsyslogd}]├─rtkit-daemon───2*[{rtkit-daemon}]├─smartd├─sshd───sshd───bash───pstree├─systemd-journal├─systemd-logind├─systemd-udevd├─tuned───4*[{tuned}]├─udisksd───4*[{udisksd}]├─upowerd───2*[{upowerd}]├─vmtoolsd───2*[{vmtoolsd}]├─wpa_supplicant└─xdg-permission-───2*[{xdg-permission-}]

查看所有进程的完整信息(PID号、用户名、完整命令)

[root@host ~]# pstree -aup
systemd,1 --switched-root --system --deserialize 22├─ModemManager,578│   ├─{ModemManager},595│   └─{ModemManager},686├─NetworkManager,729 --no-daemon│   ├─{NetworkManager},737│   └─{NetworkManager},739├─VGAuthService,603 -s├─abrt-watch-log,613 -F BUG: WARNING: at WARNING: CPU:INFO: possible rec├─abrt-watch-log,616 -F Backtrace /var/log/Xorg.0.log --/usr/bin/abrt-du├─abrtd,611 -d -s├─accounts-daemon,580│   ├─{accounts-daemon},589│   └─{accounts-daemon},685├─at-spi-bus-laun,1741,gdm│   ├─dbus-daemon,1746...│   │   └─{dbus-daemon},1749│   ├─{at-spi-bus-laun},1742│   ├─{at-spi-bus-laun},1743│   └─{at-spi-bus-laun},1745├─at-spi2-registr,1752,gdm --use-gnome-session│   ├─{at-spi2-registr},1754│   └─{at-spi2-registr},1757├─atd,1057 -f├─auditd,553│   ├─audispd,555│   │   ├─sedispatch,557│   │   └─{audispd},558│   └─{auditd},554├─avahi-daemon,607,avahi│   └─avahi-daemon,632├─boltd,1859│   ├─{boltd},1863│   └─{boltd},1866├─chronyd,622,chrony├─colord,1949,colord│   ├─{colord},1960│   └─{colord},1962├─crond,1058 -n├─cupsd,1044 -f├─dbus-daemon,1716,gdm --fork --print-pid 5 --print-address 7 ...│   └─{dbus-daemon},1717├─dbus-daemon,617,dbus --system --address=systemd: --nofork ...│   └─{dbus-daemon},684├─dbus-launch,1707,gdm --exit-with-session ...├─dnsmasq,1638,nobody ...│   └─dnsmasq,1641,root ...├─firewalld,705 -Es /usr/sbin/firewalld --nofork --nopid│   └─{firewalld},857├─gdm,1059│   ├─X,1409 :0 -background none -noreset -audit 4 -verbose -auth...│   │  ├─{X},1680│   │  ├─{X},1681│   │  └─{X},1687│   ├─gdm-session-wor,1695│   │   ├─gnome-session-b,1699,gdm --autostart...│   │   │   ├─gnome-shell,1799│   │   │   │   ├─ibus-daemon,1831 --xim --panel disable│   │   │   │   │   ├─ibus-dconf,1834│   │   │   │   │   │   ├─{ibus-dconf},1839│   │   │   │   │   │   ├─{ibus-dconf},1842│   │   │   │   │   │   └─{ibus-dconf},1843│   │   │   │   │   ├─ibus-engine-sim,1977│   │   │   │   │   │   ├─{ibus-engine-sim},1979│   │   │   │   │   │   └─{ibus-engine-sim},1980│   │   │   │   │   ├─{ibus-daemon},1832│   │   │   │   │   └─{ibus-daemon},1835│   │   │   │   ├─{gnome-shell},1802│   │   │   │   ├─{gnome-shell},1803│   │   │   │   ├─{gnome-shell},1804│   │   │   │   ├─{gnome-shell},1811│   │   │   │   ├─{gnome-shell},1812│   │   │   │   ├─{gnome-shell},1820│   │   │   │   ├─{gnome-shell},1821│   │   │   │   ├─{gnome-shell},1822│   │   │   │   ├─{gnome-shell},1823│   │   │   │   ├─{gnome-shell},1824│   │   │   │   ├─{gnome-shell},1825│   │   │   │   ├─{gnome-shell},1826│   │   │   │   ├─{gnome-shell},1827│   │   │   │   └─{gnome-shell},1828│   │   │   ├─gsd-a11y-settin,1872│   │   │   │   ├─{gsd-a11y-settin},1876│   │   │   │   ├─{gsd-a11y-settin},1877│   │   │   │   └─{gsd-a11y-settin},1934│   │   │   ├─gsd-clipboard,1874│   │   │   │   ├─{gsd-clipboard},1880│   │   │   │   └─{gsd-clipboard},1881│   │   │   ├─gsd-color,1875│   │   │   │   ├─{gsd-color},1893│   │   │   │   ├─{gsd-color},1894│   │   │   │   └─{gsd-color},1895│   │   │   ├─gsd-datetime,1882│   │   │   │   ├─{gsd-datetime},1891│   │   │   │   └─{gsd-datetime},1892│   │   │   ├─gsd-housekeepin,1885│   │   │   │   ├─{gsd-housekeepin},1887│   │   │   │   └─{gsd-housekeepin},1890│   │   │   ├─gsd-keyboard,1889│   │   │   │   ├─{gsd-keyboard},1898│   │   │   │   ├─{gsd-keyboard},1899│   │   │   │   └─{gsd-keyboard},1900│   │   │   ├─gsd-media-keys,1896│   │   │   │   ├─{gsd-media-keys},1941│   │   │   │   ├─{gsd-media-keys},1942│   │   │   │   └─{gsd-media-keys},1946│   │   │   ├─gsd-mouse,1897│   │   │   │   ├─{gsd-mouse},1901│   │   │   │   └─{gsd-mouse},1903│   │   │   ├─gsd-power,1902│   │   │   │   ├─{gsd-power},1906│   │   │   │   ├─{gsd-power},1908│   │   │   │   └─{gsd-power},1936│   │   │   ├─gsd-print-notif,1904│   │   │   │   ├─{gsd-print-notif},1905│   │   │   │   └─{gsd-print-notif},1910│   │   │   ├─gsd-rfkill,1909│   │   │   │   ├─{gsd-rfkill},1912│   │   │   │   └─{gsd-rfkill},1916│   │   │   ├─gsd-screensaver,1911│   │   │   │   ├─{gsd-screensaver},1914│   │   │   │   └─{gsd-screensaver},1917│   │   │   ├─gsd-sharing,1913│   │   │   │   ├─{gsd-sharing},1919│   │   │   │   ├─{gsd-sharing},1920│   │   │   │   └─{gsd-sharing},1922│   │   │   ├─gsd-smartcard,1918│   │   │   │   ├─{gsd-smartcard},1921│   │   │   │   ├─{gsd-smartcard},1924│   │   │   │   ├─{gsd-smartcard},1932│   │   │   │   └─{gsd-smartcard},1963│   │   │   ├─gsd-sound,1923│   │   │   │   ├─{gsd-sound},1926│   │   │   │   ├─{gsd-sound},1927│   │   │   │   └─{gsd-sound},1931│   │   │   ├─gsd-wacom,1925│   │   │   │   ├─{gsd-wacom},1938│   │   │   │   └─{gsd-wacom},1939│   │   │   ├─gsd-xsettings,1869│   │   │   │   ├─{gsd-xsettings},1878│   │   │   │   ├─{gsd-xsettings},1879│   │   │   │   └─{gsd-xsettings},1935│   │   │   ├─{gnome-session-b},1764│   │   │   ├─{gnome-session-b},1765│   │   │   └─{gnome-session-b},1781│   │   ├─{gdm-session-wor},1696│   │   └─{gdm-session-wor},1697│   ├─{gdm},1152│   ├─{gdm},1153│   └─{gdm},1408├─gssproxy,631 -D│   ├─{gssproxy},633│   ├─{gssproxy},634│   ├─{gssproxy},635│   ├─{gssproxy},636│   └─{gssproxy},637├─ibus-portal,1841,gdm│   ├─{ibus-portal},1844│   └─{ibus-portal},1845├─ibus-x11,1837,gdm --kill-daemon│   ├─{ibus-x11},1846│   └─{ibus-x11},1847├─irqbalance,610 --foreground├─ksmtuned,701 /usr/sbin/ksmtuned│   └─sleep,4360 60├─libvirtd,1051│   ├─{libvirtd},1199│   ├─{libvirtd},1200│   ├─{libvirtd},1201│   ├─{libvirtd},1202│   ├─{libvirtd},1203│   ├─{libvirtd},1204│   ├─{libvirtd},1205│   ├─{libvirtd},1206│   ├─{libvirtd},1207│   ├─{libvirtd},1208│   ├─{libvirtd},1414│   ├─{libvirtd},1415│   ├─{libvirtd},1416│   ├─{libvirtd},1417│   ├─{libvirtd},1418│   └─{libvirtd},1457├─lsmd,602,libstoragemgmt -d├─lvmetad,415 -f├─master,1359 -w│   ├─pickup,3407,postfix -l -t unix -u│   └─qmgr,1384,postfix -l -t unix -u├─packagekitd,1871│   ├─{packagekitd},1883│   └─{packagekitd},1884├─polkitd,582,polkitd --no-debug│   ├─{polkitd},638│   ├─{polkitd},687│   ├─{polkitd},689│   ├─{polkitd},696│   ├─{polkitd},697│   └─{polkitd},700├─pulseaudio,1816,gdm --start --log-target=syslog│   └─{pulseaudio},1819├─rngd,601 -f├─rpcbind,585,rpc -w├─rsyslogd,1046 -n│   ├─{rsyslogd},1082│   └─{rsyslogd},1118├─rtkit-daemon,593,rtkit│   ├─{rtkit-daemon},690│   └─{rtkit-daemon},691├─smartd,606 -n -q never├─sshd,1042 -D│   └─sshd,3780│       └─bash,3788│           └─pstree,4361 -aup├─systemd-journal,386├─systemd-logind,605├─systemd-udevd,428├─tuned,1043 -Es /usr/sbin/tuned -l -P│   ├─{tuned},1403│   ├─{tuned},1404│   ├─{tuned},1406│   └─{tuned},1407├─udisksd,609│   ├─{udisksd},629│   ├─{udisksd},688│   ├─{udisksd},706│   └─{udisksd},723├─upowerd,1807│   ├─{upowerd},1808│   └─{upowerd},1809├─vmtoolsd,604│   ├─{vmtoolsd},639│   └─{vmtoolsd},645├─wpa_supplicant,1870 -u -f /var/log/wpa_supplicant.log -c/etc/wpa_suppl└─xdg-permission-,1850,gdm├─{xdg-permission-},1851└─{xdg-permission-},1853

查询指定用户的进程

[root@host ~]# pstree -aup test
bash,4780	

三、进程的启动与控制

1、手动启动

  • 前台启动:用户输入命令,直接执行的程序;
  • 后台启动:在命令行尾加入“&”符号

  当使用cp命令从光盘中制作镜像文件时,由于需要复制的数据较多,耗时较长,因此可结合“&”符号将复制操作放到后台运行,以便用户可以继续执行其他命令操作

[root@host ~]#cp -r /dev/sr0 /opt &

nohup命令——终端关闭后任务依旧启动

nohup 英文全称 no hang up(不挂起),用于在系统后台不中断地运行命令,退出终端不会影响程序的运行。

nohup的特点

  • nohup命令,在默认情况下(非重定向时),会输出一个名叫nohup.out 的文件到当前目录下
  • 如果当前目录的 nohup.out文件不可写,输出重定向到$HOME/nohup.out文件中。
  • 一般和&后台符,结合使用。
  • 记住一个标准用法no

基本命令格式

//在当前终端前台中工作
nohup [命令与参数]//在当前终端后台中工作
nohup [命令与参数] &

基本使用方式

前台运行程序或命令,停止进程

//运行ping命令在前台
[root@host opt]# nohup ping www.baidu.com
nohup: 忽略输入并把输出追加到"nohup.out"
^C
[root@host opt]# //查看当前目录下生成了一个nohup.out文件
[root@host opt]# ll
总用量 4
-rw-------. 1 root root 1395 4月  12 22:57 nohup.out
drwxr-xr-x. 2 root root    6 10月 31 2018 rh//查看nohup.out文件内容,在nohup命令下方Ctrl+C停止ping命令,nohup.out文件内容停止更新
[root@host opt]# tail -f nohup.out 
64 bytes from 36.152.44.96 (36.152.44.96): icmp_seq=3 ttl=128 time=4.21 ms
64 bytes from 36.152.44.96 (36.152.44.96): icmp_seq=4 ttl=128 time=4.02 ms
64 bytes from 36.152.44.96 (36.152.44.96): icmp_seq=5 ttl=128 time=4.03 ms
64 bytes from 36.152.44.96 (36.152.44.96): icmp_seq=6 ttl=128 time=3.67 ms
64 bytes from 36.152.44.96 (36.152.44.96): icmp_seq=7 ttl=128 time=3.86 ms--- www.baidu.com ping statistics ---
18 packets transmitted, 5 received, 0% packet loss, time 26046ms
rtt min/avg/max/mdev = 3.544/5.022/18.818/3.403 ms

后台运行程序或命令,停止进程

//查看当前目录下文件
[root@host opt]# ll
总用量 0
drwxr-xr-x. 2 root root 6 10月 31 2018 rh
//运行ping命令在后台
[root@host opt]# nohup ping www.baidu.com &
[1] 3573
[root@host opt]# nohup: 忽略输入并把输出追加到"nohup.out"//退出当前终端
[root@host opt]# logout//重新连接终端后查看正在执行的进程
[root@host ~]# ps aux | grep ping
root       2377  0.0  0.1 463712  4172 ?        Sl   22:53   0:00 /usr/libexec/gsd-housekeeping
root       3573  0.0  0.0 150088  1992 ?        S    23:07   0:00 ping www.baidu.com
root       3624  0.0  0.0 112828   972 pts/2    S+   23:07   0:00 grep --color=auto ping//进入/opt目录查看nohup.out命令结果输出情况
[root@host ~]# cd /opt/
[root@host opt]# tail -f nohup.out 
64 bytes from 36.152.44.95 (36.152.44.95): icmp_seq=41 ttl=128 time=4.41 ms
64 bytes from 36.152.44.95 (36.152.44.95): icmp_seq=42 ttl=128 time=4.83 ms
64 bytes from 36.152.44.95 (36.152.44.95): icmp_seq=43 ttl=128 time=4.06 ms
64 bytes from 36.152.44.95 (36.152.44.95): icmp_seq=44 ttl=128 time=4.71 ms
^C
//杀掉对用ping命令的进程
[root@host opt]# kill 3573
//查看ping命令进程,已经被杀掉了
[root@host opt]# ps aux | grep ping
root       2377  0.0  0.1 463712  4172 ?        Sl   22:53   0:00 /usr/libexec/gsd-housekeeping
root       3674  0.0  0.0 112828   976 pts/2    S+   23:10   0:00 grep --color=auto ping
//查看nohup.out命令结果输出已经停止
[root@host opt]# tail -f nohup.out 
64 bytes from 36.152.44.95 (36.152.44.95): icmp_seq=158 ttl=128 time=4.57 ms
64 bytes from 36.152.44.95 (36.152.44.95): icmp_seq=159 ttl=128 time=4.78 ms
64 bytes from 36.152.44.95 (36.152.44.95): icmp_seq=160 ttl=128 time=5.54 ms
64 bytes from 36.152.44.95 (36.152.44.95): icmp_seq=161 ttl=128 time=4.66 ms
64 bytes from 36.152.44.95 (36.152.44.95): icmp_seq=162 ttl=128 time=4.07 ms
64 bytes from 36.152.44.95 (36.152.44.95): icmp_seq=163 ttl=128 time=4.53 ms
64 bytes from 36.152.44.95 (36.152.44.95): icmp_seq=164 ttl=128 time=4.52 ms
64 bytes from 36.152.44.95 (36.152.44.95): icmp_seq=165 ttl=128 time=4.48 ms
64 bytes from 36.152.44.95 (36.152.44.95): icmp_seq=166 ttl=128 time=6.27 ms
64 bytes from 36.152.44.95 (36.152.44.95): icmp_seq=167 ttl=128 time=5.16 ms

2、进程的前后台调度

Ctrl + Z 组合键

将当前进程挂起,即调入后台并停止执行

[root@host ~]# vim 1.txt[1]+  已停止               vim 1.txt

注意:要把光标放在输入的字符中间,否则可能会自动复制光标前字符并占满整个文件。

jobs命令

查看处于后台的任务列表

[root@host ~]# jobs -l
[1]+  4968 停止                  vim 1.txt

fg命令

将后台进程恢复到前台运行,可指定任务序列号

[root@host ~]fg 1
2323
abc

3、终止程序的运行

Ctrl + C组合键

中断正在执行的命令

[root@host ~]# ping  www.baidu.com
PING www.baidu.com (36.152.44.95) 56(84) bytes of data.
64 bytes from 36.152.44.95 (36.152.44.95): icmp_seq=1 ttl=128 time=4.33 ms
64 bytes from 36.152.44.95 (36.152.44.95): icmp_seq=2 ttl=128 time=4.54 ms
64 bytes from 36.152.44.95 (36.152.44.95): icmp_seq=3 ttl=128 time=4.22 ms
64 bytes from 36.152.44.95 (36.152.44.95): icmp_seq=4 ttl=128 time=4.32 ms
^C
--- www.baidu.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 12057ms
rtt min/avg/max/mdev = 4.222/4.355/4.541/0.141 ms

kill命令

  kill 从字面来看,就是用来杀死进程的命令,但事实上,这个或多或少带有一定的误导性。从本质上讲,kill 命令只是用来向进程发送一个信号,至于这个信号是什么,是用户指定的。

  也就是说,kill 命令的执行原理是这样的,kill 命令会向操作系统内核发送一个信号(多是终止信号)和目标进程的 PID,然后系统内核根据收到的信号类型,对指定进程进行相应的操作。kill命令可以概括为用于终止指定PID号的进程的命令。

基本命令格式

kill [-n] -s <信号名> <PID>

-n:选择发送指定的信号给进程,n为信号数,默认15

-s:选择发送指定的信号给进程,参数为信号数对应的信号名,默认为SIGTERN

PID:杀死指定PID的进程

kill 命令是按照 PID 来确定进程的,所以 kill 命令只能识别 PID,而不能识别进程名。

常用的信号选项

Linux 定义了几十种不同类型的信号,可以使用 kill -l 命令查看所有信号及其编号,这里仅列出几个常用的信号。

信号信号名说明
-1SIGHUP重新加载某个进程重新加载某个进程
-3SIGQUIT告诉进程保存日志后关闭退出
-9SIGKILL表示进程被终止,需要立即退出(不可被捕获也不能被忽略)
-15SIGTERM告诉进程你需要被关闭,请自行停止运行并退出(可被捕获也能被忽略)

默认情况下kill命令使用的是信号15

基本使用方式

//启动RPM包默认安装的apache服务
[root@host ~]# service httpd start
Redirecting to /bin/systemctl start httpd.service
//查看 httpd 的进程树及 PID。
//grep 命令査看 httpd 也会生成包含"httpd"关键字的进程,所以使用“-v”反向选择包含“grep”关键字的进程。
//这里使用 pstree 命令来查询进程,当然也可以使用 ps 和 top 命令
[root@host ~]#  pstree -p | grep httpd | grep -v "grep"|-httpd(6764)-+-httpd(6781)|             |-httpd(6782)|             |-httpd(6783)|             |-httpd(6786)|             `-httpd(6787)
//杀死PID是6781的httpd进程,默认信号是15,正常停止
[root@host ~]# kill 6781
[root@host ~]# pstree -p | grep httpd | grep -v "grep"|-httpd(6764)-+-httpd(6782)|             |-httpd(6783)|             |-httpd(6786)|             |-httpd(6787)|             `-httpd(6940)

kill、kill -9的区别

  首先两个指令都是杀死进行的效果。

  执行kill命令,系统会发送一个sigterm信号给对应的程序,当程序收到该sigterm信号后,有以下几种情况:1.程序立即停止;2.程序释放资源后在停止;3.程序可能继续运行。大部分情况下收到信号之后,会先释放自己的资源,然后在停止,但是也有可能收到信号之后,做一些其他事情(如果程序正在等待io,可能就马上做出相应),也就是说,sigterm多半会被阻塞。

  kill -9 命令,系统给对应的应用程序发送一个sigterm以及exit,exit信号不会阻塞。所以kill -9 能够顺利杀掉进程。

killall命令

  killall 也是用于关闭进程的一个命令,但和 kill 不同的是,killall 命令不再依靠 PID 来杀死单个进程,而是通过程序的进程名来杀死一类进程,即用于终止指定名称相关的所有进程。也正是由于这一点,该命令常与 ps、pstree 等命令配合使用。

基本命令格式

kill <进程名>

基本使用方式

//启动RPM包默认安装的apache服务
[root@host ~]# service httpd start
Redirecting to /bin/systemctl start httpd.service
//查看httpd进程
[root@host ~]# pstree -p | grep httpd | grep -v "grep"|-httpd(7088)-+-httpd(7091)|             |-httpd(7092)|             |-httpd(7093)|             |-httpd(7094)|             `-httpd(7095)
//杀死所有进程名是httpd的进程
[root@host ~]#  killall httpd
//查询发现所有的httpd进程都消失了
[root@host ~]# pstree -p | grep httpd | grep -v "grep"

pkill命令

当作于管理进程时,pkill 命令和 killall 命令的用法相同,都是通过进程名杀死一类进程。

基本命令格式

pkill -U <用户名> 
pkill -t <进程名>
pkill <关键词>

常用命令选项及含义

选项含义
-U根据进程所属的用户名终止相应进程
-t根据进程所在的终端终止相应进程
关键词根据关键词关闭所有带关键词的进程

基本使用方式

[root@host ~]# pgrep -l -U 'test'
7257 bash
7304 vim
[root@host ~]# pkill -9 -U 'test'
[root@host ~]# pgrep -l -U 'test'

查询终端方式

who命令、w命令、ps aux命令

四、计划任务管理

设置一次性计划任务——at命令

基本命令格式

at [HH:MM] [yyyy-mm-dd]

Ctrl+D提交任务

基本使用方式

//设置计划任务
[root@host ~]# at 23:24 2023-04-11
at> echo 'hello world' > /opt/1.txt
at> <EOT>
job 3 at Tue Apr 11 23:24:00 2023
//查看未执行的任务列表
[root@host ~]# atq
3	Tue Apr 11 23:24:00 2023 a root
//查看文件任务是否完成
[root@host ~]# cat /opt/1.txt
hello world//设置计划任务
[root@host ~]# at 23:27 2023-04-11
at> echo 'wao' > /opt/1.txt
at> <EOT>
job 7 at Tue Apr 11 23:27:00 2023
//查看未执行的任务列表
[root@host ~]# atq
7	Tue Apr 11 23:27:00 2023 a root
//删除第7条任务
[root@host ~]# atrm 7
//查看未执行的任务列表
[root@host ~]# atq

设置周期性计划任务——crontab命令

crontab命令用于设置周期性的计划任务,按照预先设置的时间周期(分钟、小时、天、周)重复执行用户指定的命令操作。

基本命令格式语法

crontab [-u 用户名] [选项]

常用选项及含义

选项含义
-u可指定用户,缺省时为针对当前用户
-e编辑计划任务的内容
-l查看计划任务的内容
-r删除计划任务

crontab会读取的配置文件

  1. /etc/crontab:位于文件。只有root用户能编辑,一般不会改动,默认每天,每周,每月,去执行/etc/cron.daily/etc/cron.hourly, /etc/cron.monthly 下的所有可执行文件。
  2. /etc/cron.d: 位于目录。只有root用户能编辑,当一个项目有自己的定时脚本时,将编辑好的cron文件放入这个目录下即可生效。
  3. /var/spool/cron :位于文件。使用crontab -e 编辑就是这个目录下的cron文件,文件名是用户名,所有用户都能在这个目录下编辑自己的cron文件。

crontab的应用命令

vim /var/spool/cron/用户同名文件echo '* * * * * /usr/bin/ls' >> /var/spool/cron/用户同名文件

crontab的格式讲解

50 3 2 1 * run_commad

每项工作 (每行) 的格式都是具有六个栏位,这六个栏位的意义为:

代表意义分钟小时日期月份命令
数字范围0-590-231-311-120-7要执行的命令或程序脚本

注意:周的数字为 0 或 7 时都代表星期天,数字范围取得都是整数。

特殊字符代表意义
*(星号)表示该范围内的任意时间
,(逗号)表示间隔的多个不连续时间点
-(减号)表示一个连续的时间范围
/n(斜线)指定间隔的时间频率

时间周期设置 任务内容设置 命令一定要用绝对路径,例如cp命令,要用/usr/bin/cp,可以用which查看命令的绝对路径。

常见应用示例

//周—到周五每天17点
0 17 * * 1-5//周一,周三,周五8.30
30 8 * * 1,3,5//8点到18点每两小时
0 8-18/2 * * *//每三天
0 * */3 * *

基本使用方式

//vim编辑器添加任务
[root@host ~]# vim /var/spool/cron/root
* * * * * /usr/bin/ls//crontab命令编辑任务
[root@host ~]# crontab -e
crontab: installing new crontab
您在 /var/spool/mail/root 中有新邮件
* * * * * /usr/bin/ls
* * * * * /usr/bin/cp//echo命令添加任务
[root@host ~]# echo '* * * * * /usr/bin/grep' >> /var/spool/cron/root
您在 /var/spool/mail/root 中有新邮件//crontab命令查看任务
[root@host ~]# crontab -l
* * * * * /usr/bin/ls
* * * * * /usr/bin/cp
* * * * * /usr/bin/grep
您在 /var/spool/mail/root 中有新邮件//crontab命令删除任务
[root@host ~]# crontab -r
[root@host ~]# crontab -l
no crontab for root

http://chatgpt.dhexx.cn/article/cZ2QME3U.shtml

相关文章

从“账房先生”到“中国巨型计算机之父”,慈云桂先后主导了中国四代计算机的研发...

作者 | 年素清责编 | 李雪敬出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 慈云桂是中国计算机界的先驱&#xff0c;他主导了中国第一台电子管计算机的研制&#xff0c;接着是晶体管计算机、集成电路计算机和“银河”亿次巨型机&#xff0c;是公认的“中国巨型计…

《钢琴调律原理及应用》 笔记

【【调律理论篇】】 【第一章 绪论】第一节 钢琴调律的概念 美国人威廉布雷德怀特于 1917 年发表了世界上第一部关于钢琴调律理论与技术的著作&#xff0c;书名为《钢琴调律与相关技术》 福岛琢郎于1950年发表一部名为《钢琴的构造调律修理》的专著 80年代初&#xff0c;在沈…

C#文件操作从入门到精通(1)——INI文件操作

前言: 我们在开发c#的winform程序中,因为有些参数是不断变化的 ,所以经常需要开放一些参数提供给用户设置,通过操作Ini文件来保存我们设置的参数也是c#开发中经常使用的技术,本文就来详细介绍操作ini文件的以下功能: 1、读取ini文件,获取某个节点的某个键的值 2、写入i…

【Android Framework系列】第7章 WMS原理

1 前言 前面【Android Framework系列】第5章 AMS启动流程和【Android Framework系列】第6章 AMS原理之Launcher启动流程我们分析了AMS启动以及Launcher启动的整体流程&#xff0c;那Launcher(Activity启动)后&#xff0c;UI是如何渲染到屏幕并且展示出来的呢&#xff1f;我们这…

知识图谱的建立与查询(以党史人物查询为例)

目录 0 前言 1.确定实体关系属性 2.通过EasyDL标注 3.抽取出实体和关系 4.查询 5.前端页面 0 前言 今天终于答完辩了&#xff0c;真的是舌战群儒&#xff0c;好在有惊无险。贴出唯一一张拍的答辩现场照片。&#xff08;照片里没有我哈哈哈&#xff09; 1.确定实体关系属…

[译]理解PG如何执行一个查询-1

理解PG如何执行一个查询 PG服务器收到客户端发来的查询后&#xff0c;查询的文本交给解析器。解析器扫描查询并检查它的语法。若语法正确&#xff0c;解析器会将查询文本转换成解析树。解析树是一种以正式、明确的形式表示查询含义的数据结构。给定查询&#xff1a; SELECT cus…

【*一篇足以*Java并发编程实践】《Java并发编程实践》学习Note - Part3

目录&#xff1a; 1.避免活跃度危险 1.1 死锁 1.2 避免和诊断死锁 1.3.其他活跃度危险 2.性能和可伸缩性 2.1 内存同步 2.2 阻塞 2.3 减少锁的竞争 3.Lock、ReentrantLock和Synchronized 3.1 可轮询和可定时的锁请求 3.1 可中断的锁获取操作 4.原子变量与非阻塞同步…

阿朱说:咨询的历史(万字深度长文)

&#xff08;1&#xff09;知识成为资产&#xff1a;瓦特蒸汽机 13世纪的英国&#xff0c;首先产生了人类历史上的第一部专利保护法。不过最初是很粗糙的&#xff0c;授予专利的权力完全掌握在国王手中&#xff0c;发放专利特许证&#xff0c;将某种独占经营权授予工匠、商人&a…

SpringBoot + Thymeleaf 练手小项目 --------- 豆瓣网站模拟

目录 一、项目介绍二、资源准备1. 准备数据库表2. 准备image、css、js等静态资源文件3. 项目结构 三、开发步骤1. 新建项目2. pom.xml3. 实体类 model4. Mapper 类5. service 类6. 首页 index.html 开发① MovieController② index.html 7. 电影详情页 movie_info.html 开发① …

Jmeter - webSocket 压力测试笔记

概述 编程的内核是数学&#xff0c;而测试的本质是计算&#xff0c;专业名词叫容量预估&#xff0c;而测试的大体就是用程序模拟程序&#xff0c;检测程序的正确性&#xff0c;有两个点需要注意&#xff0c;QPS最佳值和系统接收最大值&#xff0c;根据测试数据的反馈&#xff…

应用密码学(张仕斌)第五章

序列密码体制 引言Vernam&#xff08;弗纳姆&#xff09;密码技术 1917年美国电话电报公司的GilbertVernam为电报通信设计了一种十分方便的密码技术。后来称之为Vernam密码技术. 它是一种代数密码技术&#xff1a;其加密方法是&#xff0c;将明文和密钥分别表示成二进制序列&am…

SQL调优指南笔记8:Optimizer Access Paths

本文为SQL Tuning Guide第8章“优化访问路径”的笔记。 重要基本概念 access path The means by which the database retrieves data from a database. For example, a query using an index and a query using a full table scan use different access paths. 数据库从数据库…

2023年还在问前端怎么学?一份前端学习指南

&#x1f36d; Hello&#xff0c;我是爱吃糖的范同学 因为疫情摆烂了许久&#xff0c;学校里又有许多大大小小的烦心事要处理&#xff08;特别是作业和期末考试&#x1f62b;&#xff09;&#xff0c;所以在博客文章的更新上很长一段时间都没有输出很正经的文章了&#xff0c;…

【前端圭臬】一:写给入坑前端的你

专栏目录 导论 【前端圭臬】一&#xff1a;写给入坑前端的你 HTML 篇 【前端圭臬】二&#xff1a;你知道的和不知道的 HTML CSS 篇 【前端圭臬】三&#xff1a;详解 CSS 选择器 【前端圭臬】四&#xff1a;CSS 核心机制——如何确定一个属性的值&#xff1f; 【前端圭臬】…

【前端是什么】

前端是什么&#xff1f; 文章目录 前端是什么&#xff1f;1.前端的概念2. 前端的分类3. 前端的工作流程4. 互联网企业的典型组织结构图 1.前端的概念 1.1 前端的定义 对于网站来说&#xff0c;通常是指网站的前台部分&#xff0c;包括网站的表现层和结构层&#xff08;通俗点就…

前端什么知识点最难学?

这个最就很难判断&#xff0c;每个人的理解程度不一致&#xff0c;但有两种人&#xff0c;觉得难的他还没学会&#xff0c;会的不觉得难&#xff0c;但是前端不一样了&#xff0c;会了也难&#xff0c;因为谁都对前端提点建议&#xff08;啥也不懂的老板、产品经理、项目经理、…

【前端】一个好看的前端页面

序言 突发奇想&#xff0c;看到这个特效还不错&#xff0c;就加工了一下&#xff0c;如果也能帮到你&#xff0c;很开心 先上效果图 部分代码讲解 前端生成uuid function getUUID(len, radix) {var chars 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz.s…

从零学前端第一讲:前端开发是什么?给初学者有什么建议?

这里是修真院前端小课堂&#xff0c;本篇分析的主题是 【从零学前端第一讲&#xff1a;前端开发是什么&#xff1f;给初学者有什么建议&#xff1f;】 初识前端 1、前端开发是什么&#xff1f; 2、前端开发有前途吗&#xff1f; 3、前端开发哪里学&#xff1f; 4、前端发展…

前端是什么

此为小白浅显整合&#xff1a; 一直以来&#xff0c;对前端一直是一个笼统的概念&#xff0c;于是&#xff0c;专门花时间整合了网上各种说法&#xff0c;给自己一个较正确的定位。 前端是什么&#xff1f;&#xff1f; 前端&#xff0c;也称web前端。对于网站来说&#xff0…

怎么才能学好前端?

你如果知道简单的问题要百度&#xff0c;已经强过一部分人了。 至于学习方法&#xff0c;有些经验分享给你&#xff1a; 1.在学习的过程中&#xff0c;最好不是仅仅停留在前端与移动开发表层&#xff0c;不是抄书上的例子运行出结果就可以。要注意&#xff0c;即便对一个简单的…