24、Linux系统管理:进程控制、信息查询与任务调度

Linux系统管理:进程控制、信息查询与任务调度

1. 进程终止与信号处理

1.1 信号概述

在类UNIX环境中,信号是一种进程间通信机制,用于中断正在运行的进程以执行某些操作。每个信号都与一个整数值相关联,当进程接收到信号时,会执行相应的信号处理程序。例如,KILL信号用于终止进程,而Ctrl + C和Ctrl + Z也是信号的类型。在Shell脚本中,也可以发送和接收信号并做出响应。

1.2 常用信号及对应操作

信号名称 信号编号 描述
SIGHUP 1 控制进程或终端死亡时检测到的挂起信号
SIGINT 2 按下Ctrl + C时发出的信号
SIGKILL 9 用于强制杀死进程的信号
SIGTERM 15 默认用于终止进程的信号
SIGTSTP 20 按下Ctrl + Z时发出的信号

1.3 信号操作命令

  • 列出所有可用信号 :使用 kill -l 命令可以打印出信号编号和信号名称。
  • 终止进程 :使用 kill PROCESS_ID_LIST 命令,默认会发送TERM信号。进程ID列表中的各个ID之间用空格分隔。
  • 指定信号发送给进程 :使用 kill -s SIGNAL PID 命令,其中SIGNAL可以是信号名称或信号编号。例如,强制杀死进程可以使用 kill -s SIGKILL PROCESS_ID kill -9 PROCESS_ID

1.4 kill家族其他命令

  • killall命令 :可以根据进程名终止进程,如 killall process_name 。也可以指定信号,如 killall -s SIGNAL process_name ,强制杀死进程则使用 killall -9 process_name 。还可以指定用户,如 killall -u USERNAME process_name ,使用 -i 参数可以在杀死进程前进行交互式确认。
  • pkill命令 :与kill命令类似,但默认接受进程名而非进程ID。例如 pkill process_name pkill -s SIGNAL process_name ,不过pkill不支持信号名称,只支持信号编号。

1.5 信号捕获与响应

使用 trap 命令可以为脚本中的信号分配信号处理程序。语法如下:

trap 'signal_handler_function_name' SIGNAL LIST

其中SIGNAL LIST用空格分隔,可以是信号编号或信号名称。以下是一个响应SIGINT信号的示例脚本:

#!/bin/bash
#Filename: sighandle.sh
#Description: Signal handler 
function handler()
{
  echo Hey, received signal : SIGINT
}
echo My process ID is $$
# $$ is a special variable that returns process ID of current process/script
trap 'handler' SIGINT
#handler is the name of the signal handler function for SIGINT signal
while true;
do
  sleep 1
done

运行该脚本后,按下Ctrl + C会执行信号处理程序。也可以使用 kill -s SIGINT PROCESS_ID 命令向脚本发送信号。

2. 常用命令解析

2.1 which命令

用于查找命令的位置。当在终端输入命令时,终端会在由环境变量PATH指定的一组位置中查找可执行文件。可以使用 echo $PATH 查看当前的PATH设置,还可以使用 export PATH=$PATH:/home/slynux/bin 添加自己的搜索位置。例如, which ls 会输出 /bin/ls

2.2 whereis命令

与which命令类似,但不仅会返回命令的路径,还会打印手册页的位置(如果有)和命令的源代码路径(如果有)。例如, whereis ls 会输出 ls: /bin/ls /usr/share/man/man1/ls.1.gz

2.3 file命令

用于确定文件类型,使用 file FILENAME 命令可以打印文件的详细信息。例如, file /bin/ls 会输出文件的类型等信息。

2.4 whatis命令

输出作为参数的命令的单行描述,它从手册页中解析信息。例如, whatis ls 会输出 ls (1) - list directory contents

2.5 apropos命令

用于在手册页中搜索与某个单词相关的命令,使用 apropos COMMAND 进行搜索。

2.6 系统负载平均值

系统负载平均值是衡量系统总负载的重要参数,它指定了系统上可运行进程的总数的平均值,由三个值表示,分别表示1分钟、5分钟和15分钟的平均负载。可以使用 uptime 命令获取系统负载平均值。

3. 向用户终端发送消息

3.1 广播消息给所有用户

使用 cat message | wall wall < message 命令可以将消息广播给所有登录用户和所有登录终端。消息会显示发送者的信息,默认情况下,大多数发行版的“写入消息”选项是启用的,若发送者是root,无论接收者是否启用该选项,消息都会显示。可以使用 mesg y 启用写入消息, mesg n 禁用写入消息。

3.2 向指定用户终端发送消息

以下是一个向指定用户登录的终端发送消息的脚本:

#!/bin/bash
#Filename: message_user.sh
#Description: Script to send message to specified user logged terminals.
USER=$1
devices=`ls /dev/pts/* -l | awk '{ print $3,$9 }' | grep $USER | awk '{ print $2 }'`
for dev in $devices;
do
  cat /dev/stdin > $dev
done

运行脚本的命令为 ./message_user.sh USERNAME < message.txt ,需要以root身份运行。

4. 系统信息收集

4.1 常用命令获取系统信息

信息类型 命令
主机名 hostname uname -n
内核详细信息 uname -a
内核版本 uname -r
机器类型 uname -m
CPU信息 cat /proc/cpuinfo ,提取处理器名称可以使用 cat /proc/cpuinfo | head -n 5 | tail -1
内存信息 cat /proc/meminfo ,获取总内存使用 cat /proc/meminfo | head -1
磁盘分区信息 cat /proc/partitions fdisk -l
系统完整信息 lshw

4.2 /proc文件系统信息收集

/proc是GNU/Linux操作系统上的一个内存中的伪文件系统,用于从用户空间读取系统参数。每个正在运行的进程在/proc中都有一个对应的目录,目录名就是进程ID。以下是/proc/PID目录中的一些重要文件:
- environ :包含与该进程关联的环境变量。
- cwd :是指向进程工作目录的符号链接。
- exe :是指向当前进程运行的可执行文件的符号链接,如 readlink /proc/4295/exe 会输出 /bin/bash
- fd :是包含进程使用的文件描述符条目的目录。

5. cron任务调度

5.1 cron概述

cron是GNU/Linux系统中用于定期自动运行任务的实用工具,它使用“cron表”来存储要执行的脚本或命令的时间表。例如,可以在空闲时间(如夜间)安排从互联网下载文件,用户无需手动启动下载。

5.2 cron表格式

cron表由六个部分组成,依次为:分钟(0 - 59)、小时(0 - 23)、日(1 - 31)、月(1 - 12)、周(0 - 6)和要执行的命令。可以使用星号(*)表示在每个时间实例都执行,也可以用逗号分隔指定多个时间点,还可以使用 */n 表示每隔n个时间单位执行一次。以下是一些示例:
- 02 * * * * /home/slynux/test.sh :在所有小时的第2分钟执行test.sh脚本。
- 00 5,6,7 * * /home/slynux/test.sh :在所有天的第5、6、7小时执行脚本。
- 00 */12 * * 0 /home/slynux/script.sh :在周日每小时执行script.sh脚本。
- 00 02 * * * /sbin/shutdown -h :每天凌晨2点关闭计算机。

5.3 调度cron任务的方法

  • 手动编辑 :使用 crontab -e 命令,会打开默认文本编辑器(通常是vi),用户可以输入cron作业并保存。
  • 使用文件 :创建一个文本文件,如 task.cron ,写入cron作业,然后使用 crontab task.cron 命令。
  • 内联指定 :使用 crontab<<EOF EOF 之间写入cron作业,例如:
crontab<<EOF
02 * * * * /home/slynux/script.sh
EOF

5.4 crontab其他选项

  • 指定环境变量 :在cron表中插入变量赋值语句来设置环境变量,例如:
crontab<<EOF
http_proxy=http://192.168.03:3128
00 * * * * /home/slynux/download.sh
EOF
  • 查看cron表 :使用 crontab -l 查看当前用户的cron作业,使用 crontab -l -u slynux 查看其他用户的cron作业。

通过以上这些方法和命令,我们可以在Linux系统中有效地进行进程控制、信息查询和任务调度等管理工作。

6. 总结与操作流程梳理

6.1 操作流程总结

为了更清晰地展示各项操作的流程,下面以mermaid流程图的形式呈现部分关键操作的流程。

6.1.1 进程终止操作流程
graph LR
    A[开始] --> B{选择终止方式}
    B -->|按进程ID| C[使用kill命令]
    B -->|按进程名| D{选择命令}
    D -->|killall| E[使用killall命令]
    D -->|pkill| F[使用pkill命令]
    C --> G[指定信号或使用默认信号]
    E --> G
    F --> G
    G --> H[发送信号终止进程]
    H --> I[结束]
6.1.2 cron任务调度流程
graph LR
    A[开始] --> B{选择调度方式}
    B -->|手动编辑| C[使用crontab -e命令]
    B -->|使用文件| D[创建文本文件写入cron作业]
    B -->|内联指定| E[使用crontab<<EOF和EOF写入作业]
    C --> F[在编辑器中输入cron作业并保存]
    D --> G[使用crontab 文件名命令]
    E --> H[完成内联指定]
    F --> I[任务按时间表执行]
    G --> I
    H --> I
    I --> J[结束]

6.2 常见操作步骤列表

以下是一些常见操作的详细步骤列表,方便大家对照操作。

6.2.1 进程终止操作步骤
  1. 按进程ID终止进程
    • 确定要终止的进程ID。可以使用 ps 命令查看进程ID。
    • 使用 kill 命令终止进程。如果要使用默认的TERM信号,直接输入 kill PROCESS_ID ;如果要指定信号,使用 kill -s SIGNAL PROCESS_ID ,例如 kill -9 PROCESS_ID 强制杀死进程。
  2. 按进程名终止进程
    • 使用 killall 命令。如果要使用默认信号终止进程,输入 killall process_name ;如果要指定信号,使用 killall -s SIGNAL process_name ;如果要强制杀死进程,使用 killall -9 process_name 。还可以指定用户,使用 killall -u USERNAME process_name ,使用 -i 参数进行交互式确认。
    • 使用 pkill 命令。输入 pkill process_name 使用默认信号终止进程,输入 pkill -s SIGNAL process_name 指定信号终止进程(注意SIGNAL为信号编号)。
6.2.2 cron任务调度步骤
  1. 确定cron作业的时间和命令
    • 根据需求确定作业执行的时间,按照cron表的格式填写时间部分。例如,要在每天凌晨2点执行脚本 /home/slynux/test.sh ,时间部分填写 00 02 * * *
    • 确定要执行的命令,如 /home/slynux/test.sh
  2. 选择调度方式并执行
    • 手动编辑 :输入 crontab -e 命令,打开默认文本编辑器(通常是vi),在编辑器中输入cron作业,保存退出。
    • 使用文件 :创建一个文本文件,如 task.cron ,在文件中写入cron作业。然后使用 crontab task.cron 命令将作业添加到cron表中。
    • 内联指定 :使用 crontab<<EOF EOF 之间写入cron作业,例如:
crontab<<EOF
02 * * * * /home/slynux/script.sh
EOF

6.3 注意事项表格

在进行这些操作时,有一些注意事项需要大家了解,以下是一个注意事项表格。
| 操作类型 | 注意事项 |
| — | — |
| 进程终止 | - 强制杀死进程(如使用SIGKILL信号)可能会导致数据丢失或程序异常退出,尽量先使用TERM信号尝试正常终止进程。
- pkill命令不支持信号名称,只能使用信号编号。 |
| 信号捕获与响应 | - 脚本中使用信号处理程序时,需要使用无限循环(如 while true )保持进程运行,以便能够响应异步信号。 |
| cron任务调度 | - cron作业执行的环境与终端环境不同,命令需要使用完整路径,并且如果需要特定的环境变量,需要在cron表中显式设置。
- 如果执行需要高权限的命令,如关机命令,需要以root身份运行crontab命令。 |

通过以上的总结和梳理,相信大家对Linux系统中的进程控制、信息查询和任务调度等管理工作有了更清晰的认识和更深入的理解。在实际操作中,大家可以根据具体需求选择合适的方法和命令,同时注意相关的注意事项,确保操作的顺利进行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值