Linux系统管理与操作实用指南
1. 信号处理与常用命令解析
在Linux系统中,脚本执行时会打印其
PROCESS_ID
,也可通过
ps
命令查找。若未为信号指定处理程序,系统将调用默认信号处理程序。通常,按下
Ctrl + C
会终止程序,因为操作系统提供的默认处理程序会终止该进程,但自定义处理程序可在接收到信号时执行自定义操作。我们可以使用
trap
命令为任何可用信号(通过
kill -l
查看)定义信号处理程序,也能为多个信号设置单个信号处理程序。
下面介绍几个常用命令:
-
which
:用于查找命令的位置。当在终端输入命令时,终端会在一组由环境变量
PATH
指定的位置中查找可执行文件。例如:
$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
可以通过
export
命令添加自定义的搜索位置,如:
$ export PATH=$PATH:/home/slynux/bin
使用
which
命令查找
ls
命令的位置:
$ which ls
/bin/ls
-
whereis
:与
which命令类似,但它不仅返回命令的路径,还会打印手册页(如果可用)和命令源代码的路径(如果可用)。例如:
$ whereis ls
ls: /bin/ls /usr/share/man/man1/ls.1.gz
- file :用于确定文件类型。例如:
$ file /bin/ls
/bin/ls: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, stripped
- whatis :输出作为参数的命令的单行描述,它从手册页解析信息。例如:
$ whatis ls
ls (1) - list directory contents
-
apropos
:当需要搜索与某个单词相关的命令时,可以使用
apropos COMMAND在手册页中搜索命令中的字符串。 -
Load average
:系统负载平均值是衡量运行系统总负载的重要参数,它表示系统上可运行进程总数的平均值,由三个值指定,分别表示1分钟、5分钟和15分钟的平均负载。可以通过
uptime命令获取,例如:
$ uptime
12:40:53 up 6:16, 2 users, load average: 0.00, 0.00, 0.00
2. 向用户终端发送消息
系统管理员可能需要向网络中所有机器上的每个用户或指定用户的终端屏幕发送消息。
-
广播消息给所有用户
:可以使用
wall
命令。例如:
$ cat message | wall
或者
$ wall < message
消息会显示发送者的信息(用户和主机)。若要接收其他用户的消息,需启用“write message”选项,默认情况下,大多数发行版会启用该选项。若发送者是
root
,则无论接收者是否启用该选项,消息都会显示。启用和禁用该选项的命令分别为:
$ mesg y
$ mesg n
-
向指定用户终端发送消息
:可以编写如下脚本
message_user.sh:
#!/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
其工作原理是,
/dev/pts
目录包含系统中每个登录终端对应的字符设备,通过查看设备文件的所有者可以确定谁登录了哪个终端。使用
ls -l
输出设备文件的所有者和路径信息,通过
awk
和
grep
提取指定用户的终端设备列表,然后通过循环将标准输入的数据重定向到这些终端设备。
3. 收集系统信息
从命令行收集当前系统的信息对于记录系统数据非常重要,包括主机名、内核版本、Linux发行版名称、CPU信息、内存信息、磁盘分区信息等。
-
主机名
:可以使用
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
命令。
此外,
/proc
是GNU/Linux操作系统上的一个内存中的伪文件系统,可用于读取多个系统参数。每个正在运行的进程在
/proc
中都有一个以其进程ID命名的目录,其中包含该进程的许多信息,例如:
-
environ
:包含与该进程关联的环境变量。
-
cwd
:是指向进程工作目录的符号链接。
-
exe
:是指向当前进程运行的可执行文件的符号链接。
-
fd
:是包含该进程使用的文件描述符条目的目录。
4. 使用cron进行任务调度
在Linux系统中,经常需要在给定时间或时间间隔内调度脚本的执行,
cron
是一个实用工具,它通过
cron
守护进程允许任务在系统后台定期自动运行。
cron
使用“cron表”文件来存储要执行的脚本或命令及其执行时间。
4.1 cron表格式
一个cron作业指定了要执行的脚本或命令的路径以及执行时间,每个cron表由六个部分组成,顺序如下:
| 部分 | 取值范围 | 描述 |
| ---- | ---- | ---- |
| Minute | 0 - 59 | 分钟 |
| Hour | 0 - 23 | 小时 |
| Day | 1 - 31 | 日期 |
| Month | 1 - 12 | 月份 |
| Weekday | 0 - 6 | 星期几(0表示星期日) |
| COMMAND | | 要执行的脚本或命令 |
可以使用一些特殊符号来指定时间:
-
*
:表示该命令应在每个时间实例执行。
- 逗号分隔的时间值:表示在多个时间实例执行。
-
*/n
:表示每隔n个时间单位执行。
例如:
02 * * * * /home/slynux/test.sh # 每天每小时的第2分钟执行test.sh脚本
00 5,6,7 * * /home/slynux/test.sh # 每天的5、6、7点执行test.sh脚本
00 */12 * * 0 /home/slynux/script.sh # 每周日每12小时执行script.sh脚本
00 02 * * * /sbin/shutdown -h # 每天凌晨2点关机
4.2 调度cron作业的方法
-
手动编辑
:使用
crontab -e命令,会打开默认文本编辑器(通常是vi),可以在其中输入cron作业并保存。 -
使用文本文件
:创建一个文本文件(如
task.cron),写入cron作业,然后运行crontab task.cron。 - 内联指定 :使用以下格式:
crontab<<EOF
02 * * * * /home/slynux/script.sh
EOF
需要注意的是,cron作业以执行
crontab
命令的权限执行,如果需要执行需要高权限的命令(如关机),应作为
root
运行
crontab
命令。同时,cron作业中的命令应使用完整路径,因为其执行环境与终端不同,
PATH
环境变量可能未设置。
4.3 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作业(需以root身份运行)。 -
删除cron表
:使用
crontab -r命令删除当前用户的cron表,使用crontab -u slynux -r删除其他用户的cron表(需以root身份运行)。
5. 从Bash读写MySQL数据库
MySQL是一个广泛使用的数据库系统,我们可以编写Bash脚本来将文本文件或CSV文件的内容写入MySQL数据库表,并与之交互以读取和操作数据。
5.1 准备工作
要处理MySQL数据库,需要在系统上安装
mysql-server
和
mysql-client
包,并且需要有用户名和密码来运行脚本。
5.2 示例问题及解决方案
假设有一个包含学生详细信息的CSV文件,需要将文件内容插入数据库表,并为每个部门生成单独的排名列表。我们可以编写三个脚本:
-
创建数据库和表的脚本
create_db.sh
:
#!/bin/bash
#Filename: create_db.sh
#Description: Create MySQL database and table
USER="user"
PASS="user"
mysql -u $USER -p$PASS <<EOF 2> /dev/null
CREATE DATABASE students;
EOF
[ $? -eq 0 ] && echo Created DB || echo DB already exist
mysql -u $USER -p$PASS students <<EOF 2> /dev/null
CREATE TABLE students(
id int,
name varchar(100),
mark int,
dept varchar(4)
);
EOF
[ $? -eq 0 ] && echo Created table students || echo Table students already exist
mysql -u $USER -p$PASS students <<EOF
DELETE FROM students;
EOF
-
将数据插入表的脚本
write_to_db.sh:
#!/bin/bash
#Filename: write_to_db.sh
#Description: Read from CSV and write to MySQLdb
USER="user"
PASS="user"
if [ $# -ne 1 ];
then
echo $0 DATAFILE
echo
exit 2
fi
data=$1
while read line;
do
oldIFS=$IFS
IFS=,
values=($line)
values[1]="\"`echo ${values[1]} | tr ' ' '#' `\""
values[3]="\"`echo ${values[3]}`\""
query=`echo ${values[@]} | tr ' #' ', ' `
IFS=$oldIFS
mysql -u $USER -p$PASS students <<EOF
INSERT INTO students VALUES($query);
EOF
done< $data
echo Wrote data into DB
-
从数据库查询数据的脚本
read_db.sh:
#!/bin/bash
#Filename: read_db.sh
#Description: Read from the database
USER="user"
PASS="user"
depts=`mysql -u $USER -p$PASS students <<EOF | tail -n +2
SELECT DISTINCT dept FROM students;
EOF`
for d in $depts;
do
echo Department : $d
result="`mysql -u $USER -p$PASS students <<EOF
SET @i:=0;
SELECT @i:=@i+1 as rank,name,mark FROM students WHERE dept="$d" ORDER BY mark DESC;
EOF`"
echo "$result"
echo
done
5.3 执行脚本
按照以下顺序执行脚本:
$ ./create_db.sh
Created DB
Created table students
$ ./write_to_db.sh studentdat.csv
Wrote data into DB
$ ./read_db.sh
Department : CS
rank name mark
1 Navin M 98
2 Nawaz O 80
3 Kavya N 70
Department : EC
rank name mark
1 Hari S 80
2 Neenu J 70
3 Alex M 50
4 Bob A 30
Department : AE
rank name mark
1 Anu M 90
2 Sruthi 89
3 Andrew 89
5.4 脚本工作原理
-
create_db.sh:用于创建名为students的数据库和其中的students表。使用mysql命令进行数据库操作,通过-u指定用户名,-p指定密码,使用<<EOF方法提供多个SQL查询。通过检查$?变量来判断数据库或表是否已存在。 -
write_to_db.sh:接受一个CSV文件名作为参数,使用while循环读取文件的每一行,将逗号分隔的值存储在数组中。由于名称可能包含空格,需要将空格替换为#,并对字符串进行引号处理,最后形成SQL查询并执行。 -
read_db.sh:首先查询不同的部门名称,然后使用while循环遍历每个部门,运行查询以按成绩降序显示学生信息,并使用SET @i=0设置变量i为0,在每行递增并显示为学生的排名。
通过以上内容,我们了解了Linux系统中的信号处理、常用命令、消息发送、系统信息收集、任务调度以及与MySQL数据库的交互等重要操作,这些知识对于系统管理和开发工作都非常有帮助。
Linux系统管理与操作实用指南
6. 总结与拓展应用
6.1 知识体系回顾
在前面的内容中,我们系统地学习了Linux系统管理与操作的多个重要方面,下面通过一个流程图来回顾这些知识的关联与应用顺序:
graph LR
A[信号处理与命令解析] --> B[消息发送]
B --> C[系统信息收集]
C --> D[任务调度]
D --> E[数据库交互]
A --> F(which/whereis等命令)
B --> G(广播/指定用户消息)
C --> H(主机名/内核/CPU等信息)
D --> I(cron表格式/调度方法)
E --> J(创建表/插入数据/查询数据)
从信号处理开始,我们了解了如何处理系统信号以及常用命令的使用,这为后续的操作奠定了基础。向用户终端发送消息让系统管理员能够有效地与用户进行沟通。收集系统信息帮助我们全面了解系统的状态,为系统的优化和维护提供依据。任务调度则使得一些重复性的工作可以自动执行,提高了工作效率。最后,与MySQL数据库的交互让我们能够在Bash脚本中实现对数据库的读写操作,拓展了脚本的应用场景。
6.2 拓展应用场景
-
自动化运维
:结合任务调度和系统信息收集,可以实现自动化的系统监控和维护。例如,使用
cron定期收集系统的负载信息、内存使用情况等,并通过脚本将这些信息发送给管理员,以便及时发现系统的异常情况。以下是一个简单的脚本示例:
#!/bin/bash
#Filename: system_monitor.sh
#Description: Monitor system load and send message to admin
load=$(uptime | awk -F 'load average: ' '{print $2}' | cut -d, -f1)
if (( $(echo "$load > 1.0" | bc -l) )); then
echo "System load is high: $load" | wall
fi
将这个脚本添加到
cron
表中,每隔一段时间执行一次:
*/5 * * * * /path/to/system_monitor.sh
- 数据处理与分析 :利用Bash脚本与MySQL数据库的交互能力,可以对大量的数据进行处理和分析。例如,从CSV文件中读取数据并插入数据库后,使用SQL查询进行数据的统计和分析,生成报表。以下是一个简单的统计每个部门平均成绩的脚本示例:
#!/bin/bash
#Filename: analyze_data.sh
#Description: Analyze student data in MySQL database
USER="user"
PASS="user"
depts=`mysql -u $USER -p$PASS students <<EOF | tail -n +2
SELECT DISTINCT dept FROM students;
EOF`
for d in $depts;
do
avg_mark=`mysql -u $USER -p$PASS students <<EOF
SELECT AVG(mark) FROM students WHERE dept="$d";
EOF`
echo "Department: $d, Average mark: $avg_mark"
done
7. 常见问题与解决方案
7.1 cron作业不执行的问题
-
问题描述
:设置了
cron作业,但作业没有按时执行。 -
可能原因及解决方案
:
-
权限问题
:确保执行
crontab命令的用户具有足够的权限来执行脚本中的命令。如果脚本需要高权限,应使用root用户执行crontab。 -
环境变量问题
:由于
cron作业的执行环境与终端不同,PATH等环境变量可能未正确设置。在脚本中显式设置所需的环境变量,例如:
-
权限问题
:确保执行
#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# Rest of the script
- **脚本路径问题**:确保脚本的路径是正确的,并且脚本具有可执行权限。可以通过`chmod +x`命令为脚本添加可执行权限。
7.2 MySQL连接失败的问题
- 问题描述 :在执行Bash脚本与MySQL数据库交互时,出现连接失败的错误。
-
可能原因及解决方案
:
-
用户名和密码错误
:检查脚本中设置的
USER和PASS变量是否正确。 -
MySQL服务未启动
:使用
systemctl status mysql命令检查MySQL服务的状态,如果服务未启动,使用systemctl start mysql命令启动服务。 -
防火墙限制
:确保防火墙允许MySQL服务的端口(通常是3306)通过。可以使用
iptables或firewalld等工具进行配置。
-
用户名和密码错误
:检查脚本中设置的
8. 最佳实践建议
- 脚本编写规范 :在编写Bash脚本时,遵循良好的编程规范,添加必要的注释,提高脚本的可读性和可维护性。例如,在脚本开头添加脚本的描述、作者、日期等信息。
-
错误处理
:在脚本中添加适当的错误处理机制,例如使用
$?变量检查命令的执行结果,根据结果进行相应的处理。以下是一个简单的示例:
#!/bin/bash
mysql -u user -p password <<EOF
SELECT * FROM table;
EOF
if [ $? -ne 0 ]; then
echo "MySQL query failed"
exit 1
fi
-
数据备份
:在进行数据库操作时,定期进行数据备份,以防止数据丢失。可以使用
mysqldump命令进行数据库备份,例如:
mysqldump -u user -p password database_name > backup.sql
通过掌握以上的Linux系统管理与操作知识,以及应对常见问题的解决方案和最佳实践建议,我们可以更加高效、稳定地管理Linux系统,实现各种自动化任务和数据处理需求。希望这些内容能帮助你在Linux系统的使用和开发中取得更好的效果。
超级会员免费看
1368

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



