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 进程终止操作步骤
-
按进程ID终止进程
-
确定要终止的进程ID。可以使用
ps命令查看进程ID。 -
使用
kill命令终止进程。如果要使用默认的TERM信号,直接输入kill PROCESS_ID;如果要指定信号,使用kill -s SIGNAL PROCESS_ID,例如kill -9 PROCESS_ID强制杀死进程。
-
确定要终止的进程ID。可以使用
-
按进程名终止进程
-
使用
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任务调度步骤
-
确定cron作业的时间和命令
-
根据需求确定作业执行的时间,按照cron表的格式填写时间部分。例如,要在每天凌晨2点执行脚本
/home/slynux/test.sh,时间部分填写00 02 * * *。 -
确定要执行的命令,如
/home/slynux/test.sh。
-
根据需求确定作业执行的时间,按照cron表的格式填写时间部分。例如,要在每天凌晨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系统中的进程控制、信息查询和任务调度等管理工作有了更清晰的认识和更深入的理解。在实际操作中,大家可以根据具体需求选择合适的方法和命令,同时注意相关的注意事项,确保操作的顺利进行。
超级会员免费看

被折叠的 条评论
为什么被折叠?



