Linux入门(五)-系统管理

四、系统管理

4.1 进程简介

无论是 Linux 系统管理员还是普通用户,监视系统进程的运行情况并适时终止一些失控的进程,是每天的例行事务。和 Linux 系统相比,进程管理在 Windows 中更加直观,它主要是使用"任务管理器"来进行进程管理的。

通常,使用"任务管理器"主要有 3 个目的:
利用"应用程序"和"进程"标签来査看系统中到底运行了哪些程序和进程;
利用"性能"和"用户"标签来判断服务器的健康状态;
在"应用程序"和"进程"标签中强制中止任务和进程;

Linux 中虽然使用命令进行进程管理,但是进程管理的主要目的是一样的,即查看系统中运行的程序和进程、判断服务器的健康状态和强制中止不需要的进程。

那么,到底什么是进程呢?它和我们平时所说的“程序”又有什么联系呢?
什么是进程和程序
进程是正在执行的一个程序或命令,每个进程都是一个运行的实体,都有自己的地址空间,并占用一定的系统资源。程序是人使用计算机语言编写的可以实现特定目标或解决特定问题的代码集合。

这么讲很难理解,那我们换一种说法。程序是人使用计算机语言编写的,可以实现一定功能,并且可以执行的代码集合。而进程是正在执行中的程序。当程序被执行时,执行人的权限和属性,以及程序的代码都会被加载入内存,操作系统给这个进程分配一个 ID,称为 PID(进程 ID)。

也就是说,在操作系统中,所有可以执行的程序与命令都会产生进程。只是有些程序和命令非常简单,如 ls 命令、touch 命令等,它们在执行完后就会结束,相应的进程也就会终结,所以我们很难捕捉到这些进程。但是还有一些程序和命令,比如 httpd 进程,启动之后就会一直驻留在系统当中,我们把这样的进程称作常驻内存进程。

某些进程会产生一些新的进程,我们把这些进程称作子进程,而把这个进程本身称作父进程。比如,我们必须正常登录到 Shell 环境中才能执行系统命令,而 Linux 的标准 Shell 是 bash。我们在 bash 当中执行了 ls 命令,那么 bash 就是父进程,而 ls 命令是在 bash 进程中产生的进程,所以 ls 进程是 bash 进程的子进程。也就是说,子进程是依赖父进程而产生的,如果父进程不存在,那么子进程也不存在了。
进程管理的作用
在使用 Windows 系统的过程中,使用任务管理器,很大程度上是为了强制关闭“未反应”的软件,也就是杀死进程。的确,这是很多使用进程管理工具或进程管理命令的人最常见的使用方法。不过,杀死进程(强制中止进程)只是进程管理工作中最不常用的手段,因为每个进程都有自己正确的结束方法,而杀死进程是在正常方法已经失效的情况下的后备手段。

那么,进程管理到底应该是做什么的呢?我以为,进程管理主要有以下 3 个作用。

  1. 判断服务器的健康状态
    运维工程师最主要的工作就是保证服务器安全、稳定地运行。理想的状态是,在服务器出现问题,但是还没有造成服务器宕机或停止服务时,就人为干预解决了问题。

进程管理最主要的工作就是判断服务器当前运行是否健康,是否需要人为干预。如果服务器的 CPU 占用率、内存占用率过高,就需要人为介入解决问题了。这又出现了一个问题,我们发现服务器的 CPU 或内存占用率很高,该如何介入呢?是直接终止高负载的进程吗?

当然不是,应该判断这个进程是否是正常进程,如果是正常进程,则说明你的服务器已经不能满足应用需求,你需要更好的硬件或搭建集群了;如果是非法进程占用了系统资源,则更不能直接中止进程,而要判断非法进程的来源、作用和所在位置,从而把它彻底清除。

当然,如果服务器数量很少,我们完全可以人为通过进程管理命令来进行监控与干预,但如果服务器数量较多,那么人为手工监控就变得非常困难了,这时我们就需要相应的监控服务,如 cacti 或 nagios。总之,进程管理工作中最重要的工作就是判断服务器的健康状 态,最理想的状态是服务器宕机之前就解决问题,从而避免服务器的宕机。
2) 查看系统中所有的进程
我们需要查看看系统中所有正在运行的进程,通过这些进程可以判断系统中运行了哪些服务、是否有非法服务在运行。
3) 杀死进程
这是进程管理中最不常用的手段。当需要停止服务时,会通过正确关闭命令来停止服务(如 apache 服务可以通过 service httpd stop 命令来关闭)。只有在正确终止进程的手段失效的情况下,才会考虑使用 kill 命令杀死进程。

其实,进程管理和 Windows 中任务管理器的作用非常类似,不过大家在使用任务管理器时是为了杀死进程,而不是为了判断服务器的健康状态。
在 Linux 系统中,每个进程都有一个唯一的进程号(PID),方便系统识别和调度进程。通过简单地输出运行程序的程序名,就可以运行该程序,其实也就是启动了一个进程。

总体来说,启动一个进程主要有 2 种途径,分别是通过手工启动和通过调度启动(事先进行设置,根据用户要求,进程可以自行启动),接下来就一一介绍这 2 中方式。

  1. Linux手工启动进程
    手工启动进程指的是由用户输入命令直接启动一个进程,根据所启动的进程类型和性质的不同,其又可以细分为前台启动和后台启动 2 种方式。
  • 前台启动进程
    这是手工启动进程最常用的方式,因为当用户输入一个命令并运行,就已经启动了一个进程,而且是一个前台的进程,此时系统其实已经处于一个多进程的状态(一个是 Shell 进程,另一个是新启动的进程)。
    实际上,系统自动时就有许多进程悄悄地在后台运行,不过这里为了方便读者理解,并没有将这些进程包括在内。

假如启动一个比较耗时的进程,然后再把该进程挂起,并使用 ps 命令查看,就会看到该进程在 ps 显示列表中,例如:

[root@localhost ~]# find / -name demo.jpg <--在根目录下查找 demo.jpg 文件,比较耗时
#此处省略了该命令的部分输出信息
#按“CTRL+Z”组合键,即可将该进程挂起
[root@localhost ~]# ps <--查看正在运行的进程
PID  TTY      TIME   CMD
2573 pts/0  00:00:00 bash
2587 pts/0  00:00:01 find
2588 pts/0  00:00:00 ps

将进程挂起,指的是将前台运行的进程放到后台,并且暂停其运行,有关挂起进程和 ps 命令用法,后续做详细介绍。

通过运行 ps 命令查看进程信息,可以看到,刚刚执行的 find 命令的进程号为 2587,同时 ps 进程的进程号为 2588。

  • 后台启动进程
    进程直接从后台运行,用的相对较少,除非该进程非常耗时,且用户也不急着需要其运行结果的时候,例如,用户需要启动一个需要长时间运行的格式化文本文件的进程,为了不使整个 Shell 在格式化过程中都处于“被占用”状态,从后台启动这个进程是比较明智的选择。

从后台启动进程,其实就是在命令结尾处添加一个 " &" 符号(注意,& 前面有空格)。输入命令并运行之后,Shell 会提供给我们一个数字,此数字就是该进程的进程号。然后直接就会出现提示符,用户就可以继续完成其他工作,例如:

[root@localhost ~]# find / -name install.log &
[1] 1920
#[1]是工作号,1920是进程号

以上介绍了手工启动的 2 种方式,实际上它们有个共同的特点,就是新进程都是由当前 Shell 这个进程产生的,换句话说,是 Shell 创建了新进程,于是称这种关系为进程间的父子关系,其中 Shell 是父进程,新进程是子进程。

值得一提的是,一个父进程可以有多个子进程,通常子进程结束后才能继续父进程;当然,如果是从后台启动,父进程就不用等待子进程了。
2. Linux调度启动进程
在 Linux 系统中,任务可以被配置在指定的时间、日期或者系统平均负载量低于指定值时自动启动。

例如,Linux 预配置了重要系统任务的运行,以便可以使系统能够实时被更新,系统管理员也可以使用自动化的任务来定期对重要数据进行备份。

实现调度启动进程的方法有很多,例如通过 crontab、at 等命令,有关这些命令的具体用法,本章后续章节会做详细介绍。

4.1 date

用来显示或设定系统的日期与时间,系统重启后失效

date 参数
参数:
-d<字符串>:显示字符串所指的日期与时间。字符串前后必须加上双引号;
-s<字符串>:根据字符串来设置日期与时间。字符串前后必须加上双引号;
-u:显示GMT;
–help:在线帮助;
–version:显示版本信息

显示时间:
date
设置时间:
date -s ”2022-05-15 14:36

Tips:

  • UTC:协调世界时,又称世界统一时间、世界标准时间、国际协调时间。由于英文(CUT)和法文(TUC)的缩写不同,作为妥协,简称UTC。
  • GMT即格林尼治 平太阳时间,是指格林尼治所在地的标准时间,也是表示地球自转速率的一种形式
  • CST北京时间 (中国国家标准时间)
  • 东八区东八区(UTC/GMT+08:00)是比世界协调时间(UTC)/格林尼治时间(GMT)快8小时的时区,理论上的位置是位于东经112.5度至127.5度之间,是东盟标准的其中一个候选时区。当格林尼治标准时间为0:00时,东八区的标准时间为08:00

4.2 系统进程管理

4.2.1 top

top 命令——查看进程动态信息(以全屏交互式的界面显示进程排名,及时跟踪系统资源占用情况),top命令为交互式命令,可以使用键盘进行命令。
M键-根据内存情况进行排序
N键-根据启动时间进行排序
P键-根据CPU占用情况进行排序
使用q键退出。

各进程(任务)的状态监控属性解释说明:

  • 系统任务(Task)信息 :total ,总进程数; running,正在运行的进程数;sleeping,休眠的进程数;stopped,中止的进程数;zombie,僵死无响应的进程数。
  • CPU占用信息:us,用户占用;sy,内核占用;ni,优先级调度占用;id,空闲CPU;wa,I/O等待占用;hi,硬件终端占用;si,软件中断占用;st,虚拟化占用。要了解空闲的CPU百分比,主要看 %id 部分。
  • 内存占用(MEM)信息:total,总内存空间;free,空闲内存;used,已用内存;buff / cache,物理内存和交换内存的缓冲区总和。
  • 交换空间(swap) 占用:total,总交换空间;free,空闲交换空间;used,已用交换空间;avail Mem,可用物理空间。
  • 第六行以下为统计信息区域
    PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
    PID — 进程id
    PPID 父进程id
    RUSER   Real user name
    UID 进程所有者的用户id
    USER — 进程所有者
    GROUP 进程所有者的组名
    TTY 启动进程的终端名。不是从终端启动的进程则显示为 ?
    PR — 进程优先级
    NI — nice值。负值表示高优先级,正值表示低优先级
    P 最后使用的CPU,仅在多CPU环境下有意义
    TIME 进程使用的CPU时间总计,单位秒
    TIME+ 进程使用的CPU时间总计,单位1/100秒
    VIRT — 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
    SWAP 进程使用的虚拟内存中,被换出的大小,单位kb。
    RES — 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
    CODE 可执行代码占用的物理内存大小,单位kb
    DATA 可执行代码以外的部分(数据段+栈)占用的物理内存大小,单位kb
    SHR — 共享内存大小,单位kb
    nFLT 页面错误次数
    nDRT 最后一次写入到现在,被修改过的页面数。
    S — 进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程
    %CPU — 上次更新到现在的CPU时间占用百分比
    %MEM — 进程使用的物理内存百分比
    TIME+ — 进程使用的CPU时间总计,单位1/100秒
    COMMAND — 进程名称(命令名/命令行),显示完整命令,与top命令不同的就是command属性像是进行了命令补全
    WCHAN 若该进程在睡眠,则显示睡眠中的系统函数名
    Flags 任务标志,参考 sched.h

备注:默认情况下仅显示比较重要的 PID、USER、PR、NI、VIRT、RES、SHR、S、%CPU、%MEM、TIME+、COMMAND 列。可以通过下面的快捷键来更改显示内容

top [选项]
选项:
-d n  指定每两次屏幕信息刷新之间的时间间隔。n 为具体的秒数。

-p pid  通过指定监控进程ID来仅仅监控某个进程的状态。pid 为具体进程ID。 如果是多个进程,只要$ top -p pid1,pid2,pid3

-q   该选项将使top没有任何延迟的进行刷新。如果调用程序有超级用户权限,那么top将以尽可能高的优先级运行。 

-S  指定累计模式 

-s  使top命令在安全模式中运行。这将去除交互命令所带来的潜在危险。 

-i  使top界面不显示任何闲置或者僵死进程。只显示运行中的线程。 

-c  COMMAND 选项显示整个命令行而不只是显示命令名。

-b  top显示的时候,将每一次显示的结果都打印出来,不会将上一次的结果给冲掉

-u username  显示某个用户的进程信息,username 为具体用户名,比如 root。

-H  显示线程的信息,不显示进程信息。
交互命令:
A: 根据单窗口切换成多窗口,可以看到四个不同的窗口,可以通过a或者w来切换多个窗口。 四个窗口的名字分别为:Def,Job,Mem,Usr。

f : 进入一个动态配置top的界面中,按a-z即可显示或隐藏指定的列,按 Esc 或 Enter 都可保存并退回到 top 信息。

o: 进入一个动态配置top的界面中, 可以改变列的显示顺序,按小写的 a-z 可以将相应的列向右移动,而大写的 A-Z 可以将相应的列向左移动。按 Esc 或 Enter 都可保存并退回到 top 信息。

R: top界面第一列数据进行倒序排列。

k : 终止一个进程。系统将提示用户输入需要终止的进程PID,以及需要发送给该进程什么样的信号。一般的终止进程可以使用15信号;如果不能正常结束那就使用信号9强制结束该进程。默认值是信号15。在安全模式中此命令被屏蔽。

i: 隐藏闲置和僵死进程。这是一个开关式命令。

q: 退出top程序,Ctrl + C 也可以退出。

S: 切换到累计模式。

s : 改变两次刷新之间的延迟时间。系统将提示用户输入新的时间,单位为s。如果有小数,就换算成ms。输入0值则系统将不断刷新,默认值是5 s。需要注意的是如果设置太小的时间,很可能会引起不断刷新,从而根本来不及看清显示的情况,而且系统负载也会大大增加。

r: 重新安排一个进程的优先级别。系统提示用户输入需要改变的进程PID以及需要设置的进程优先级值。输入一个正值将使优先级降低,反之则可以使该进程拥有更高的优先权。默认值是10。

l:切换显示平均负载和启动时间信息。即显示隐藏第一行。

m: 切换显示内存信息。即显示隐藏内存行。

t : 切换显示进程和CPU状态信息。即显示隐藏CPU行。

c: 切换显示命令名称和完整命令行。 显示完整的命令。 这个功能很有用。

M : 根据驻留内存大小RES进行从大到小排序。

P: 根据CPU使用百分比大小%CPU进行从高到底排序。

T: 根据时间/累计时间TIME+进行从多到少排序。

W: 将当前设置写入~/.toprc文件中。这是写top配置文件的推荐方法

h或者? 显示帮助画面,给出一些简短的命令总结说明,按 Esc 或 Enter 都可退回到 top 信息。

1:在第三行显示多核CPU信息。

4.2.2 htop(增强版top)

4.2.3 ps

  要对进程进行检测和控制,首先必须要了解当前进程的情况,也就是需要查看当前进程运行状态。Linux 系统中我们可以使用 ps 命令查看进程。
  ps(process status) 命令是 Linux 下最常用的进程查看工具,使用该命令可以确定哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵尸、哪些进程占用了过多的资源等等。

注意:ps 命令工具显示的是进程的瞬间状态,并不是动态连续显示,如果想对进程状态进行实时监控应该用 top 命令.

ps [选项] 
选项:
 -e:显示系统内所有进程的信息。与 -A 选项功能相同
 -f:使用完整 (full) 的格式显示进程信息,如果只有 ps -e 则输出进程信息的格式和只使用 ps 一样(都只有PID TTY TIME CMD这几项,但是输出信息的内容和ps的不一样)
-a:显示当前终端下的所有进程信息,包含其他用户的进程信息。和 x 选项结合使用可以显示系统中所有进程的信息
- x:显示当前用户在所有终端下的进程信息
- u:使用以用户为主的格式输出进程信息
  1. 执行任何不加选项的 ps 命令
[root@VM_81_181_centos ~]# ps

  PID       TTY          TIME          CMD

22402     pts/1        00:00:00       bash

22447     pts/1         00:00:00         ps

直接执行不加任何选项的 ps 命令时,则只显示当前用户会话中打开的进程。第一行为列表标题,包含基本四个字段,各个字段的含义描述如下:
PID:表示该进程的唯一 ID 号
TTY 或 TT:启动进程的终端名。表示该进程在哪个终端上运行。不是从终端启动的进程或与终端机无关的进程则显示为 ?
TIME:该进程使用 CPU 的累计时间
CMD:该进程所运行的命令

  1. 使用参数显示
ps -e
      各字段含义如下:

      UID:启动该进程的用户的 ID 号

      PPID:代表该进程的父进程的 ID 号

      C:进程的 CPU 处理器利用率

      STIME/START:表示进程的启动时间

注意:也可以使用 ps -eF 命令查看系统内的所有进程信息,输出的进程信息比使用 ps -ef 多三个信息分别是:SZ,RSS,PSR 关于这三个感兴趣的可以自己上网查阅一下

  1. 使用 BSD 语法查看系统上的进程信息
ps ax
显示PID、TTY、STAT、TIME、COMMAND字段
- STAT字段:表示进程的当前状态
R:running,运行或可运行状态(在运行队列中)。正在运行或准备运行的进程。
S:interruptable sleeping,可中断睡眠(等待事件完成)。正在睡眠的进程。
D:uninterruptable sleeping,不可中断的睡眠进程(通常为IO)。
T:stopped,停止或被追踪的进程。由作业控制信号停止。
Z:zombie,失败终止的(“僵死”)进程。
s:session leader,会话层状态。代表的父进程
N:低优先级进程
<:高优先级进程
+:前台进程。在前台进程组中
l:多线程进程。
ps -aux
# 字段描述:

      # USER:启动该进程的用户帐号名称

      # %CPU:表示进程的 CPU 占用率

      # %MEM:表示进程的内存占用率

      # VSZ:表示进程虚拟内存的大小,以 KB 为单位
  1. ps命令与其他命令组合
  • 当使用 aux 选项查看进程的 CPU 或内存使用量来筛选,从而方便找出占用资源最多的进程,但是默认情况下不排序,在这里我们可以使用 --sort 命令选项排序,例如:
    ps aux --sort=%mem 或 ps aux --sort %mem 这两条命令是一样的,也可以使用 ps aux --sort=+%mem 或 ps aux --sort +%mem,
    %mem 前面默认有一个加号 + ,加不加上结果都是一样的,都表示升序排序,如果想要降序排序并且看到字段标题可以在 %mem 前面加上减号 -。
  • 根据特定条件过滤
    在这里介绍一下和 grep 命令结合使用
    显示名为sshd的进程信息与仅仅显示一个名为 sshd 的进程信息
    ps -ef | grep sshd
    ps -ef | grep sshd | grep -v grep
    ps aux | grep sshd
    ps aux | grep sshd | grep -v grep

4.2.4 kill

删除执行中的程序或工作(可强制终止)

kill [-s <信息名称或编号>][程序] 或 kill [-l <信息编号>]
参数说明:
-l <信息编号>  若不加<信息编号>选项,则-l参数会列出全部的信息名称。
-s <信息名称或编号>  指定要送出的信息。
[程序]  [程序]可以是程序的PID或是PGID,也可以是工作编号。
例如:
kill 15624 ///杀死一个进程
kill -KILL 15624 ///强制杀死进程
kill -9 15624 ///彻底杀死进程,常用
kill -9 $(ps -ef | grep itcase) 
kill -u itcase ///杀死itcase用户的进程

4.2.5 进程调用或打开的文件信息lsof

我们知道,通过 ps 命令可以查询到系统中所有的进程,那么,是否可以进一步知道这个进程到底在调用哪些文件吗?当然可以,使用 lsof 命令即可。

lsof 命令,“list opened files”的缩写,直译过来,就是列举系统中已经被打开的文件。通过 lsof 命令,我们就可以根据文件找到对应的进程信息,也可以根据进程信息找到进程打开的文件。
在 Linux 系统中,一切皆文件。通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以 lsof 不仅可以查看进程打开的普通文件、目录,还可以查看进程监听的端口等 socket 相关的信息。进程打开的每一个文件,系统在后台都会为之分配一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。因为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息,因此通过 lsof 工具能够查看这个列表,对系统监测以及排错很有帮助。

lsof 查看的打开文件可以是:

  1. 普通文件
  2. 目录
  3. 字符或块设备文件
  4. 共享库
  5. 管道、命名管道
  6. 符号链接
  7. 网络文件(如 NFS file、网络 socket,Unix 域名 socket)
  8. 其它类型的文件,等等
4.2.5.1 命令格式
lsof [OPTIONS] [--] [NAMES]      ##	在没有任何选项的情况下,lsof 列出所有属于活动进程的打开文件。
4.2.5.2 选项
-a #参数被视为逻辑与 AND,会影响全部的参数
-A A #在配置了 AFS 分布式网络文件系统的系统上可用,其 AFS 内核代码是通过动态模块实现的。通过 A 指定备用名称列表文件,在该文件中可以找到动态模块的内核地址
-b #避免 lsof 因调用可能阻塞的内核函数而产生阻塞,比如 lstat(2)、readlink(2) 和 stat(2) 等内核函数
-c (常用)  #显示出以字符或字符串 C 开头的命令程序开启的文件,如 lsof -c init。如果 C 以斜杠 / 开头和结尾,则斜杠之间的字符被解释为正则表达式。该选项可多次指定
+c 指定 COMMAND 列的宽度,单位字符。默认为 9
-C  #禁用从内核的名称缓存中报告任何路径名
-D #指导 lsof 使用设备缓存文件。该选项的使用有时受到限制。-D 必须后面跟着一个函数字母,函数字母后面可以有一个路径名称。lsof 识别以下功能字母:
	?	报告设备缓存文件路径
	b	构建设备缓存文件
	i	忽略设备缓存文件
	r	读取设备缓存文件
	u	读取并更新设备缓存文件
+D 递归搜索目录 D。如显示在 /usr/local 及其子目录下被程序开启的文件:lsof +D /usr/local
+d (常用) #非递归搜索目录 D。如显示在 /usr/local 下被程序开启的文件:lsof +d /usr/local
-d #指定文件描述符列表,可以采用逗号分隔,也可以指定范围。比如 1,2,3 或 1-3。如果前面包含尖号^,表示排除。如显示 FD 为 4 的进程:lsof -d 4
+|-e S #豁免(exempt)路径名称为 S 的文件系统不受可能阻塞的内核函数调用的影响。+e 选项豁免 stat(2)、lstat(2) 和大多数 readlink(2) 内核函数调用。-e 选项只能豁免 stat(2) 和 lstat(2) 内核函数调用
+|-E    # +E 指定使用端点信息显示 Linux 管道、Linux UNIX 套接字和 Linux 伪终端文件,并显示端点的文件。-E 则不显示端点的文件
-F   #指定字符列表 LIST,选择输出给另一程序处理的字段,各字段对应的字符见下文
+|-f [cfgGn]  # f 本身澄清了路径名参数的解释方式。当后面跟着 c、f、g、G 或 n 时,它指定要启用(+)或抑制(-)内核文件结构信息。
	c 文件结构使用计数(not Linux)
	f 文件结构地址(not Linux)
	g 文件标志缩写(Linux 2.6.22 及更高版本)
	G 十六进制文件标志(Linux 2.6.22 及更高版本)
	n 文件结构节点地址(not Linux)	
-g [PGID] # 选择或排除属于指定进程组的进程打开的文件。 进程组 ID 使用逗号分隔,如果 PGID 前面包含尖号^,表示排除。若没有指定 PGID,则显示全部。如显示 PGID 为 6 和 7 的进程:lsof -g6,7	
-i [I](常用) # 选择其 Internet 地址与 -i 中指定的地址匹配的文件,若没有相关地址被指定,则监听全部。
	用法: lsof -i [46][protocol][@hostname|hostaddr][:serivce|port]
	说明:4 6 分别表示 IPv4 和 IPv6   
    protocol: TCP or UDP   
    hostname:主机名
    hostaddr:IPv4 或 IPv6 地址
    service:主机提供的服务的名称,即 /etc/services 中的 service name
    port:端口号
-K # 在支持任务(线程)报告方式的系统上输出进程的任务(线程)列表	
-k 指定内核名称列表文件,代替 /vmunix、/mach 等	
-l # 禁止将 user ID 转换为登录的名称,默认是登录名称
+|-L [L]  # + 或 - 表示开启或关闭显示文件连接数,如果只有单纯的 +L,后面没有任何数字,则表示显示全部,如果后面有数字,只有文件连接数少于该数字的会被列出	
+|-m  # -m 指定一个内核内存文件 M ,代替 /dev/kmem 或 /dev/mem。+m 将装载补充文件写入标准输出文件	
+|-M  # 启用或禁用报告本地 TCP、UDP 和 UDPLITE 端口的端口映射器注册
-n  # 不将 IP 地址转换为主机名
-N # 显示 NFS 文件
-o # 始终显示文件偏移量。它导致 SIZE/OFF 输出列标题更改为 OFFSET
-o   #指定在文件偏移量的 0t 之后要打印的小数位数
-O  # 指示 lsof 避免被某些内核操作阻塞。即在分叉的子进程中执行它们。虽然使用此选项将减少 lsof 启动开销,但也可能导致 lsof 在内核不响应函数时挂起。谨慎使用此选项	
-P # 禁止将网络文件的端口号转换为端口名
-p (常用) # 排除或选择进程的文件列表,进程 ID 列表使用逗号分隔,如 123 或 123,^456。尖号表示排除指定 PID	
-R # 使用列 PPID 列出父进程的 PID
+|-r [T[mFMT]] # 控制 lsof 不断重复执行,间隔 T 秒,默认为 15s。-r 永远不断地执行,直到收到中断讯号(ctrl+ c),+r 一直执行,直到没有文件被显示。可选的 mFMT 参数指定标记线的格式,格式 FMT 遵循 C 语言标准库函数 strftime(3) 的规范
 -S [T]  # 指定内核函数 lstat(2)、readlink(2) 和 stat(2) 的可选超时秒值,否则可能会死锁。t 的最小值是 2;默认值是 15
-s [P:S]   # 列出文件的大小,若该文件没有大小,则留下空白。它导致 SIZE/OFF 输出列标题更改为 SIZE。P 表示协议名称 TCP  or  UDP,S 表示逗号分隔的协议状态
-T [T]
	-T 没有参数则禁用 TCP/TPI 信息报告。跟如下参数,则显示指定 TCP/TPI 信息:
	f 选择报告套接字选项,状态和值,以及 TCP标志和值
	q 选择队列长度
	s 选择连接状态
	w 选择窗口大小	
-t  # 生成只有进程标识符而没有标题的简洁输出,这样输出可以通过管道传递给 kill(1) 杀死
-U  #	选择 UNIX 域套接字文件的列表
-u USERS(常用) # 选择登录名或用户 ID 位于逗号分隔集 USERS 中的用户的文件列表。如 root 或 548,root”,如果用户名或用户 ID 前有尖号 ^,表示排除
-V # 指示被要求列出但找不到的项
-v  # 显示版本信息
+|-w # 启用(+)或禁用(-)警告消息
-X  # 	Linux 下跳过所有打开的 TCP、UDP 和 UDPLITE IPv4 和 IPv6 文件的信息报告
-x [fl]  # 一般与选项 +d 和 +D 选项,指示搜索时是否跨文件系统和符号链接。-x 不跟任何参数时,表示跨文件系统和符号链接
-Z [Z] # 指定如何处理 SELinux 安全上下文。当在运行的 Linux 内核中禁用SELinux时,Z 字段将被抑制输出。-Z 选项不跟参数,如 -Z -,安全上下文将列在 SECURITY-CONTEXT 列中输出
-- # 双减号表示选项结束	
NAMES # 列出指定文件,符号链接在使用前将被解析
4.2.5.3 输出字段说明
COMMAND:进程的名称
PID:进程标识符
TID:任务 ID。Linux 下 TID 为空表示该行为进程
USER:进程所有者
FD:文件描述符。主要有:
	cwd:应用程序当前工作目录,这是该应用程序启动的目录,除非它本身对这个目录进行更改
	txt:该类型的文件是程序代码,如应用程序二进制文件本身或共享库,如上列表中显示的 /sbin/init 程序
	lnn:库引用(AIX)
	err:FD 信息错误
	jld:监狱目录(FreeBSD)
	ltx:共享库文本(代码和数据)
	mxx:十六进制内存映射类型号 xx
	m86:DOS合并映射文件
	mem:内存映射文件
	mmap:内存映射设备
	pd:父目录
	rtd:根目录
	tr:内核跟踪文件(OpenBSD)
	v86:VP/ix 映射文件
	0:标准输出
	1:标准输入
	2:标准错误

	文件描述符后一般还跟着文件状态模式:
	r:只读模式
	w:写入模式
	u:读写模式
	空格:文件的状态模式为 unknow,且没有锁定
	-:文件的状态模式为 unknow,且被锁定
	
	同时在文件状态模式后面,还跟着相关的锁:
	N:对于未知类型的 Solaris NFS 锁
	r:文件部分的读锁
	R:整个文件的读锁
	w:文件的部分写锁
	W:整个文件的写锁
	u:任何长度的读写锁
	U:用于未知类型的锁
	x:用于部分文件上的 SCO OpenServer Xenix 锁
	X:用于整个文件上的 SCO OpenServer Xenix 锁
	space:无锁

TYPE:文件类型。常见的文件类型有:
	REG:普通文件
	DIR:表示目录
	CHR:表示字符类型
	BLK:块设备类型
	UNIX:UNIX 域套接字
	FIFO:先进先出队列
	IPv4:IPv4 套接字
	
DEVICE:磁盘名称
SIZE:文件的大小或文件偏移量(以字节为单位)
NODE:索引节点
NAME:打开文件的确切名称
4.2.5.4 特定格式输出

当指定了 -F 选项时,lsof 将生成适合由另一个程序(如 awk 或 Perl 脚本或 C 程序)处理的输出。

下面是 lsof 可输出的字段,单个字符表示字段标识符:

a	文件访问模式
c	进程命令名
C	文件结构共享计数
d	文件的设备字符码
D	文件的主要/次要设备号
F	文件结构地址
f	文件描述符
G	文件标志
g	进程组 ID
i	文件 inode 编号
K	任务 ID
k	链接计数
L	进程登录名
m	重复输出之间的标记
N	节点标识符
n	文件名、注释、Internet 地址
o	文件偏移量(十进制)
P	协议名称
p	进程 ID
R	父进程 ID
r	原始设备号
S	文件的流标识
s	文件大小(十进制)
T	TCP/TPI 信息
t	文件类型
u	进程用户 ID
Z	SELinux 安全上下文(禁用 SELinux 时禁用)
z	Solaris 10 及更高版本的区域名
0	使用NUL字段结束符字符代替NL
1-9	系统特定的字段标识符
  可以使用命令 lsof -F? 查看上面字段的说明信息。
4.2.5.5 常用示例
lsof | head  #无任何参数,列出所有属于活动进程的打开文件。
COMMAND     PID   TID USER   FD      TYPE             DEVICE SIZE/OFF       NODE NAME
systemd       1       root  cwd       DIR              252,1     4096          2 /
systemd       1       root  rtd       DIR              252,1     4096          2 /
systemd       1       root  txt       REG              252,1  1616248      47908 /usr/lib/systemd/systemd
systemd       1       root  mem       REG              252,1    20032      25897 /usr/lib64/libuuid.so.1.3.0
systemd       1       root  mem       REG              252,1   252704      25043 /usr/lib64/libblkid.so.1.1.0
systemd       1       root  mem       REG              252,1    90632      25988 /usr/lib64/libz.so.1.2.7
systemd       1       root  mem       REG              252,1   153192      25496 /usr/lib64/liblzma.so.5.0.99
systemd       1       root  mem       REG              252,1    23968      25065 /usr/lib64/libcap-ng.so.0.0.0
systemd       1       root  mem       REG              252,1    19888      25018 /usr/lib64/libattr.so.1.1.0

#lsof /bin/bash  #查看谁正在使用某个文件,也就是说查找某个文件相关的进程。
COMMAND     PID USER  FD   TYPE DEVICE SIZE/OFF  NODE NAME
watchdog.  7639 root txt    REG  252,1   922760 45210 /usr/bin/bash
bash       8591 root txt    REG  252,1   922760 45210 /usr/bin/bash
bash       9694 root txt    REG  252,1   922760 45210 /usr/bin/bash
bash      20151 root txt    REG  252,1   922760 45210 /usr/bin/bash

lsof +D ./test   #递归查看某个目录下所有被打开的文件信息。
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
bash    8518 root  cwd    DIR  252,1     4096 799036 ./test/shell

lsof -u root #列出某个用户打开的文件信息。
 lsof -c sshd   #列出某个进程所打开的文件信息。
  -c 选项将会列出所有以 sshd 开头的进程所打开的文件。其实也可以通过命令lsof | grep sshd来查看,但是第一种方法更加简洁。

lsof -c mysql -c apache  #列出多个进程打开的文件信息。
lsof -u test -c mysql   #列出某个用户以及某个进程所打开的文件信息。
  注意,-u 与 -c 选项之间是或的关系。可以使用 -
lsof -u ^root  #列出除了某个用户外的所有被打开的文件信息。
  尖号 ^ 在用户名之前,表示排除在外,即不显示 root 用户所打开的文件信息。
lsof -p 1   #通过某个进程号显示该进程打开的文件
lsof -p 1,2,3  #列出多个进程号对应的文件信息。
lsof -i   #列出所有的网络连接。
lsof -i tcp  #列出所有的 TCP 网络连接信息。
lsof -i udp  #列出所有 UDP 网络连接信息。
lsof -i :3306  #列出谁在使用某个端口。
lsof -i udp:55  #列出谁在使用某个特定的 UDP 或 TCP 端口。
lsof -a -u test -i  #列出某个用户的所有活跃的网络端口。
lsof -g 5555  #查看某个用户组所打开的文件信息。
lsof -d txt
lsof -d 1
lsof -d 2   #根据指定文件描述符的文件信息。
  0 表示标准输入,1 表示标准输出,2 表示标准错误,从而可知:所以大多数应用程序所打开的文件的 FD 都是从 3 开始。
lsof -d 2-3   #查看指定文件描述符范围的文件信息。
lsof -c sshd -a -d txt #列出 COMMAND 列中包含字符串 sshd 且文件描符的类型为 txt 的文件信息。
COMMAND   PID USER  FD   TYPE DEVICE SIZE/OFF  NODE NAME
sshd     8254 root txt    REG  252,1   819608 27632 /usr/sbin/sshd
sshd    20149 root txt    REG  252,1   819608 27632 /usr/sbin/sshd
lsof -i @peida.linux:20,21,22,25 -r 3 # 列出目前连接主机 peida.linux 上端口为:20,21,22,25 相关的所有文件信息,且每隔 3 秒不断地执行 lsof 指令。

4.3 定时任务

crond是linux系统中用来定期执行命令或指定程序的一种服务或软件。
特殊要求:(秒级别)crond服务就无法搞定了,一般工作中写脚本用守护进程执行

  1. linux系统crond的定时任务
  • linux系统自身定期执行的任务操作,如轮询系统日志、备份系统数据、清理系统缓存等,这些任务无需我们人为干预。系统的crontab文件是/etc/crontab
    例如:

[root@linzhongniao ~]# ls -l /var/log/messages*
-rw-------. 1 root root 206776 Aug 2 17:43 /var/log/messages
-rw-------. 1 root root 448307 Jul 8 08:54 /var/log/messages-20180708
-rw-------. 1 root root 742560 Jul 16 04:05 /var/log/messages-20180716
-rw-------. 1 root root 1293433 Jul 22 15:15 /var/log/messages-20180722
-rw-------. 1 root root 622193 Jul 30 20:14 /var/log/messages-20180730
[root@linzhongniao ~]# ll /etc/|grep cron
-rw-------. 1 root root541 Aug 24 2016 anacrontab
drwxr-xr-x. 2 root root 4096 Jul 16 14:19 cron.d
drwxr-xr-x. 2 root root 4096 Jul 16 14:18 cron.daily
-rw-------. 1 root root 0 Aug 24 2016 cron.deny
drwxr-xr-x. 2 root root 4096 Jul 16 14:19 cron.hourly
drwxr-xr-x. 2 root root 4096 Jun 14 05:01 cron.monthly
-rw-r–r–. 1 root root457 Sep 27 2011 crontab
drwxr-xr-x. 2 root root 4096 Sep 27 2011 cron.weekly

  1. 用户执行的任务操作:某个用户或系统管理员定期要做的任务工作,例如每隔5分钟和互联网上时间服务器进行同步,每天晚上0点备份站点数据及数据库数据,一般这些工作需要由每个用户自行设置才行。
    用户执行的任务工作,也就是运维管理员执行的任务工作,因此这个用户执行的任务是我们的重点。
    用户所建立的crontab文件存于/var/spool/cron/***中如:root用户的定时任务配置文件为/var/spool/cron/root。

  2. 定时任务文件
    |文件|说明 |
    |–|–|
    | /etc/cron.deny |该文件中所列用户不允许使用crontab命令 |
    |/etc/cron.allow|该文件所列用户允许使用crontab命令,优先于/etc/cron.deny|
    |/var/spool/cron|默认存放所有用户得crontab配置文件,文件名以用户名命名|
    |/var/log/cron|定时任务日志文件|

linux系统下的定时任务还真不少,例如:at,crontab,anacron

at:适合仅执行一次就结束的调度任务命令,例如:某天晚上需要处理一个任务,仅仅是这一天的晚上,属于突发性任务,要执行at命令,还需要启动atd的服务才行

[root@linzhongniao ~]# chkconfig --list|grep atdatd 0:off 1:off 2:off 3:off 4:off 5:off 6:off[root@linzhongniao ~]# chkconfig --list atdatd 0:off 1:off 2:off 3:off 4:off 5:off 6:off

4.3.1 at

4.3.2 crontab

crontab命令来自于英文词组“cron table”的缩写,其功能是管理定时计划任务。定时计划任务,故名意思就计划好的任务,到了时间就会自动执行,在Linux系统中的crond是一个定时计划任务服务,用户只要能够按照正确的格式(分、时、日、月、星期、命令)写入到配置文件中,那么就会按照预定的周期时间自动的执行下去,而crontab命令则是用于配置的工具名称。
通过crontab我们可以在固定的时间执行指定的系统指令或script脚本。时间间隔的单位是分钟,小时,日,月,周及以上的任意组合(注意:日和周不要组合)。
实际上是通过修改定时任务文件来实现的。

crontab -[选项] 
选项:
-u user #指定用户执行任务,默认是root
-l #查看crontab文件内容,操作/var/spool/cron/*用户   文件
-e #编辑crontab文件内容,操作/var/spool/cron/*用户   文件,会检查语法,但是通过vi修改不会
-i #删除crontab文件内容,删除前会提示确认
-r # 删除crontab文件内容

使用 crontab -e命令后,会进入用户编辑模式,需要像使用vi编辑器编辑文件内容。

  • 用户定时任务
    crontab用户的定时任务一般分为6段空格分隔。系统的定时任务则/etc/crontab分为7段,前5段为时间设定段,第六段以哪个用户执行crontab,第七段为所要执行的命令段
00-59  # 第一段,代表分钟
00-23 #第二段,代表小时
01-31 #第三段,代表日
01-12 #第四段,代表月
0-7(0与7都是周日) #第五段,代表星期,周几
特殊字符:
*    # 星号表示任意时间段,例如:00 23 * * * cmd 表示每年每月每日的23:00执行cmd任务。*在段位上,代表整个取值范围,如*在分钟位,代表00-59,每分钟都执行一次
-   #减号表示分隔符,表示时间范围,区间段。如16-18点
, #逗号,表示分隔时段,如30 15,17-19 * * * cmd 代表每年每月每日的 15:30;17:30;18:30;19:30执行cmd
/n #n代表数字,每隔n单位时间,执行一次任务
  • 系统定时任务
    系统定时任务分七段,如果某一台服务器上的用crontab –l查看没有定时任务,就上系统定时任务里面用cat查看。

~]# cat /etc/crontab
SHELL=/bin/bash shell解释器
PATH=/sbin:/bin:/usr/sbin:/usr/bin PATH变量
MAILTO=root 定义如果任务有输出,发给哪个用户默认是root用户HOME=/# For details see man 4 crontabs# Example of job definition:# .---------------- minute (0 - 59)# | .------------- hour (0 - 23)# | | .---------- day of month (1 - 31)# | | | .------- month (1 - 12) OR jan,feb,mar,apr …# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat# | | | | |# * * * * * user-name command to be executed 分 时 日 月 周 用户 脚本
通过run-parts使得系统可以定时执行目录下的所有可执行文件

按周执行的配置文件

[root@linzhongniao ~]# tree /etc/cron.weekly/etc/cron.weekly0 directories, 0 files
按天执行的配置文件

[root@linzhongniao ~]# ll /etc/cron.daily/total 24 -rwx------. 1 root root 180 Jul 10 2003 logrotate -rwx------. 1 root root 927 Mar 22 2017 makewhatis.cron -rwx------. 1 root root 189 Jan 26 2015 mlocate.cron -rwxr-xr-x. 1 root root 2126 Jul 19 2013 prelink -rwxr-xr-x. 1 root root 563 Nov 23 2013 readahead.cron -rwxr-xr-x. 1 root root 433 Nov 7 2015 tmpwatch

  • 注意事项
  1. 编辑定时任务分钟位上必须用00格式表示
    例如,6月3日上午9:00去培训,规则为00 09 03 06 *

  2. 周和日不能同时使用
    强调周和日尽量不要同时用,否则可能达不到想要的效果
    例如:
    每周日上午9:30去上课
    30 09 * * 7或者 30 09 * * 0
    为定时任务规则加必要的注释

  3. 加必要注释,写定时任务规则时尽可能加上注释(最好是英文注释),这是个好的习惯。

  4. 执行脚本任务前加/bin/sh

执行定时任务时,如果是执行脚本,请尽量在脚本前面加上/bin/sh命令,否则有可能忘了给脚本加执行权限,而无法完成任务。

  1. 在指定用户下执行相关的定时任务

需要root权限执行的任务可以登录到root用户下然后设置,如果不需要root权限,可以登录到普通用户下(也可以直接在root下crontab –u user –e的写法直接设置)

  1. 平时工作中尽量多用crontab –e和crontab –l去编辑和查看定时任务,因为会有语法错误检查。

  2. 定时任务结尾加>/dev/null 2>&1
    /dev/null是特殊的设备,表示黑洞设备或空设备;2>&1表示标准错误输出和标准输出的输出的路径都一样。>/dev/null 2>&1相当于1>/dev/null,2>/dev/null

4.3.2.1 示例

每天晚上12点打包站点目录/var/www/html备份到/data目录下(最好每次按时间生成不同的备份包)

/# cat httpd.sh#!/bin/bashcd /var/www/tar zcfp /data/html_$(date +%Y%m%d%H%M).tar.gz ./html
/# crontab -l |tail -2#tar /var/www/html by shell scripts by user at 20180800 00 * * * /bin/bash /server/scripts/httpd.sh >/dev/null 2>&1

6.生产场景如何调试crontab定时任务
6.1 增加执行频率调试任务

在调试时,把任务执行频率调快一些。如:每分钟、每5分钟执行一次,或者比当前时间推迟5分钟以后或者每2钟执行。按己想象的去执行了,如果没问题再改成需要的任务执行的时间。

强调:有些任务是不允许频繁执行的,例如:定时往数据库里插入数据,这样的任务在测试机上测试好,然后正式线上出现问题的机会就少了。

6.2 调整系统时间调适任务

用正确的执行任务的时间。设置完成后,可以修改下当前时间,改成任务执行时间的前几分钟来测试(或者重启定时任务服务)如:定时任务9:00执行,我们可以把系统时间改成8:55分,然后观察是不是正确执行了,当前时间要比任务时间提前足够长,只在测试服务器上操作,如果生产服务器不要这样处理。

6.3 通过日志输出调试定时任务

在脚本中加入日志输出,然后把输出打到指定的日志中,然后观察日志内容结果。看是否执行或正确执行,或向下面的内容把脚本结果重定向到一个log文件里。比如 tar zcvf命令加-v参数,在把输出放到日志里面,通过日志就可以查看脚本有没有执行。

*/2 * * * * /usr/sbin/ntpdate time.windows.com >>/app/ntpdate.log
6.4 注意一些任务执行带来的问题

*/1 * * * * echo “==”>>/tmp/oldboy.log >/dev/null 2>&1
这是隐蔽的无法执行的任务配置,原因是前面多了一个>>/tmp/oldboy.log,或者去掉>/dev/null 2>&1。

6.5 注意环境变量导致的定时任务故障

在调试java程序的时候,注意环境变量,要把环境变量的定义追加到脚本里,重新export一下。一般都放在全局变量/etc/profile里面,但是用定时任务执行脚本还需要重新加载一下环境变量。

export PATH=“/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin”
6.6 通过定时任务日志/var/log/cron调试定时任务

]# tail -f /var/log/cronAug 5 11:01:01 localhost run-parts(/etc/cron.hourly)[2054]: starting 0anacronAug 5 11:01:02 localhost anacron[2068]: Anacron started on 2018-08-05Aug 5 11:01:02 localhost run-parts(/etc/cron.hourly)[2070]: finished 0anacronAug 5 11:01:02 localhost anacron[2068]: Will run job `cron.daily’ in 34 min.Aug 5 11:01:02 localhost anacron[2068]: Jobs will be executed sequentiallyAug 5 11:02:01 localhost CROND[2075]: (root) CMD (/usr/sbin/ntpdate time.windows.com >/app/ntpdate.log)
7.生产定时任务注意事项
7.1 export变量问题

crontab执行shell时只能识别不多的系统环境变量,普通变量是无法识别的。如果在编写的脚本中需要使用变量,最好使用export重新声明一下该变量,脚本才能正常执行。例如生产中和java相关的服务任务和脚本。也可以在脚本中添加PATH环境变量加完PATH环境变量就不用写执行命令全路径了。例如下面的/bin/tar,就可以不写了。

[root@linzhongniao ~]# cat /server/scripts/tar.sh#!/bin/bashexport PATH="/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin"cd /server//bin/tar zcf backup_$(date +%Y%m%d%H%M).tar.gz ./scripts
7.2 任务路径问题

一定要用绝对路径不要用相对路径。推荐定时执行脚本。

7.3 脚本权限问题

要加/bin/sh执行,也可以不在定时任务中用/bin/sh就要给脚本可执行权限。

7.4 时间变量问题

“%”百分号在crontab任务中认为是newline,需要用“”转义。crontab任务命令中,如果有“date +%Y%m%d%H%M”(或date +%Y-%m-%d-%H:%M),必须替换为“date +%Y%m%d%H%M”,但写在脚本中的“%”百分号就不需要转义了。

7.5 定时任务加注释

写定时任务要加上注释如:什么人,什么时间,因为谁,做了什么事都要标记清楚如谁与2018-08-01日在http服务器上做了10分钟同步的操作。

7.6 使用脚本程序替代命令

使用脚本执行任务可以减少错误,提升效率,规范,是个好习惯。

7.7 定时任务脚本的问题

定时任务脚本中的程序命令尽量用全路径。

8.生产环境定时任务重现生产no space left
企业inode被填满的企业案例

问题:修改用户密码和添加用户时出现下面错误,但是用df –h发现磁盘没满,请问为什么?

1、修改密码时报错 passwd: Authentication token manipulation error 2、添加用户报错:unable to lock password file
分析思路:查看/etc/passwd和/etc/shadow的文件权限没有问题,再使用命令strace -f passwd 追踪分析原因,看到关键报错信息:“No space left on device”。最后用df -hi查看发现根分区的inode满了。

解决办法:

(1 打开邮件服务,打开邮件服务就把邮件目录清空了不要直接删除文件,生产环境邮件服务是不开的。

(2 在定时任务最后加>/dev/null 2>&1将输出内容定义到空。这样就不会产生垃圾文件了。

转载地址:https://blog.51cto.com/10642812/2280981

博客作者海风掠过的原创作品

4.3.3 服务器时间同步

4.3.3.1 手动同步时间

dateSat Aug 4 12:08:20 CST 2018
date -s "23:00"Sat Aug 4 23:00:00 CST 2018
dateSat Aug 4 23:00:03 CST 2018
which ntpdate/usr/sbin/ntpdate
/usr/sbin/ntpdate ntp1.aliyun.com 4 Aug 12:10:21 ntpdate[1700]: step time server 52.163.118.68 offset -39052.961525 sec
dateSat Aug 4 12:10:30 CST 2018

4.3.3.2用定时任务自动同步

crontab -l#sync sys time by user at 2018-08-04 */2 * * * * /usr/sbin/ntpdate ntp1.aliyun.com >/dev/null 2>&1
/etc/init.d/crond restartStopping crond: [ OK ]Starting crond:[ OK ]
date -s "23:00"Sat Aug 4 23:00:00 CST 2018
dateSat Aug 4 23:00:06 CST 2018
dateSat Aug 4 12:21:53 CST 2018
机器少还可以和互联网上时间同步,如果有很多服务器,可以搭建一个内部的时间同步服务器ntp server。
提示:如果不加“>/dev/null 2>&1”会因产生垃圾文件导致磁盘inode耗尽的问题。

3.4.7 shutdown

关闭系统,可以在关机之前传送讯息给使用者,也可用来重开机

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

3.4.8 reboot

重新启动计算机

reboot [-nwdfi]
参数:
-n : 在重开机前不做将记忆体资料写回硬盘的动作
-w : 并不会真的重开机,只是把记录写到 /var/log/wtmp 档案里
-d : 不把记录写到 /var/log/wtmp 档案里(-n 这个参数包含了 -d)
-f : 强迫重开机,不呼叫 shutdown 这个指令
-i : 在重开机之前先把所有网络相关的装置先停止

3.4.9 其他命令

  • lastb ///查看本机上有哪些IP在远程登录:
  • netstat -tupln 查看某种服务是否运行
  • locale 查看系统的默认语言
    -a ///查看所有语言选项

你可能感兴趣的:(Linux,linux,运维,服务器)