为您找到与Linux怎么写脚本相关的共200个结果:
对于如何在Windows系统上面怎么进行系统备份相信大家都知道,那么大家知道Linux通过shell脚本怎么备份系统吗?读文网小编分享了Linux通过shell脚本备份系统的方法,希望对大家有所帮助。
脚本如下:
#!/bin/sh
#Automatic Backup Linux System Files
#Author wugk 2013-11-22
#Define Variable
SOURCE_DIR=(
$*
)
TARGET_DIR=/data/backup/
YEAR=`date +%Y`
MONTH=`date +%m`
DAY=`date +%d`
WEEK=`date +%u`
FILES=system_backup.tgz
CODE=$?
if
[ -z “$*” ];then
echo -e “Please Enter Your Backup Files or Directories--------------------------------------------Example $0 /boot /etc 。。。。。。”
exit
fi
#Determine Whether the Target Directory Exists
if
[ ! -d $TARGET_DIR/$YEAR/$MONTH/$DAY ];then
mkdir -p $TARGET_DIR/$YEAR/$MONTH/$DAY
echo “This $TARGET_DIR is Created Successfully !”
fi
#EXEC Full_Backup Function Command
Full_Backup()
{
if
[ “$WEEK” -eq “7” ];then
rm -rf $TARGET_DIR/snapshot
cd $TARGET_DIR/$YEAR/$MONTH/$DAY ;tar -g $TARGET_DIR/snapshot -czvf $FILES `echo ${SOURCE_DIR[@]}`
[ “$CODE” == “0” ]&&echo -e “--------------------------------------------These Full_Backup System Files Backup Successfully !”
fi
}
#Perform incremental BACKUP Function Command
Add_Backup()
{
cd $TARGET_DIR/$YEAR/$MONTH/$DAY ;
if
[ -f $TARGET_DIR/$YEAR/$MONTH/$DAY/$FILES ];then
read -p “These $FILES Already Exists, overwrite confirmation yes or no ? : ” SURE
if [ $SURE == “no” -o $SURE == “n” ];then
sleep 1 ;exit 0
fi
#Add_Backup Files System
if
[ $WEEK -ne “7” ];then
cd $TARGET_DIR/$YEAR/$MONTH/$DAY ;tar -g $TARGET_DIR/snapshot -czvf $$_$FILES `echo ${SOURCE_DIR[@]}`
[ “$CODE” == “0” ]&&echo -e “-----------------------------------------These Add_Backup System Files Backup Successfully !”
fi
else
if
[ $WEEK -ne “7” ];then
cd $TARGET_DIR/$YEAR/$MONTH/$DAY ;tar -g $TARGET_DIR/snapshot -czvf $FILES `echo ${SOURCE_DIR[@]}`
[ “$CODE” == “0” ]&&echo -e “-------------------------------------------These Add_Backup System Files Backup Successfully !”
fi
fi
}
Full_Backup;Add_Backup
上面就是Linux使用shell脚本备份系统的方法介绍了,通过上面的脚本就能自动备份系统,但脚本可能还存在不足的地方,可自行改良优化。
看过“Linux通过shell脚本怎么备份系统”
浏览量:3
下载量:0
时间:
Linux备份可以通过多种方法完成,那么你知道怎么通过shell脚本备份Linux系统吗?小编为大家分享了通过shell脚本备份Linux系统的解决方法,下面大家跟着读文网小编一起来了解一下吧。
脚本如下:
#!/bin/sh
#Automatic Backup Linux System Files
#Author wugk 2013-11-22
#Define Variable
SOURCE_DIR=(
$*
)
TARGET_DIR=/data/backup/
YEAR=`date +%Y`
MONTH=`date +%m`
DAY=`date +%d`
WEEK=`date +%u`
FILES=system_backup.tgz
CODE=$?
if
[ -z “$*” ];then
echo -e “Please Enter Your Backup Files or Directories
Example $0 /boot /etc 。”
exit
fi
#Determine Whether the Target Directory Exists
if
[ ! -d $TARGET_DIR/$YEAR/$MONTH/$DAY ];then
mkdir -p $TARGET_DIR/$YEAR/$MONTH/$DAY
echo “This $TARGET_DIR is Created Successfully !”
fi
#EXEC Full_Backup Function Command
Full_Backup()
{
if
[ “$WEEK” -eq “7” ];then
rm -rf $TARGET_DIR/snapshot
cd $TARGET_DIR/$YEAR/$MONTH/$DAY ;tar -g $TARGET_DIR/snapshot -czvf $FILES `echo ${SOURCE_DIR[@]}`
[ “$CODE” == “0” ]&&echo -e “These Full_Backup System Files Backup Successfully !”
fi
}
#Perform incremental BACKUP Function Command
Add_Backup()
{
cd $TARGET_DIR/$YEAR/$MONTH/$DAY ;
if
[ -f $TARGET_DIR/$YEAR/$MONTH/$DAY/$FILES ];then
read -p “These $FILES Already Exists, overwrite confirmation yes or no ? : ” SURE
if [ $SURE == “no” -o $SURE == “n” ];then
sleep 1 ;exit 0
fi
#Add_Backup Files System
if
[ $WEEK -ne “7” ];then
cd $TARGET_DIR/$YEAR/$MONTH/$DAY ;tar -g $TARGET_DIR/snapshot -czvf $$_$FILES `echo ${SOURCE_DIR[@]}`
[ “$CODE” == “0” ]&&echo -e “These Add_Backup System Files Backup Successfully !”
fi
else
if
[ $WEEK -ne “7” ];then
cd $TARGET_DIR/$YEAR/$MONTH/$DAY ;tar -g $TARGET_DIR/snapshot -czvf $FILES `echo ${SOURCE_DIR[@]}`
[ “$CODE” == “0” ]&&echo -e “These Add_Backup System Files Backup Successfully !”
fi
fi
}
Full_Backup;Add_Backup
上面就是Linux使用shell脚本备份系统的方法介绍了,通过上面的脚本就能自动备份系统,但脚本可能还存在不足的地方,可自行改良优化。
看过“ 怎么通过shell脚本备份Linux系统 ”
浏览量:2
下载量:0
时间:
最近迷上了php脚本,整天满脑子都是php.也用php写了一些脚本,甚至服务来完成一些日常服务器管理的任务,下面学习阿拉小编就给大家介绍下Unix/Linux中如何直接执行PHP脚本文件。
使用Linux系统的服务器都有搭建完整的PHP环境,因此有些用户会用PHP去写一些执行自动化任务的脚本,可是发现每次执行PHP脚本都需要使用php myscript.php的方式,感觉有点麻烦。其实我们是可以直接执行PHP脚本文件的
由于我们的服务器都是使用的 Linux 系统,并且都有搭建完整的 PHP 环境,所以有时候我会用 PHP 写一些执行自动化任务的脚本,但是每次执行这个 PHP 脚本都需要使用 php myscript.php 的方式,
编写你的脚本文件
这里我们编写一个名字为 test_run.php 的文件,文件的内容如下:
Here is some plain text.
Here is the file name:
<?php
echo $argv[0], PHP_EOL;
?>
脚本内容很简单,就是把当前脚本文件的名称打印出来。
然后,我们使用 PHP 命令执行一下这个脚本:
yuanyu@ymac:phpworkspace $ php test_run.php hello
Here is some plain text.
Here is the file name:
test_run.php
yuanyu@ymac:phpworkspace $
给脚本文件增加头信息,并且设置权限
然后,在这个文件的第一行写上 php 命令的全路径,前面是一个 #!:
#!/usr/bin/php
Here is some plain text.
Here is the file name:
<?php
echo $argv[0], PHP_EOL;
?>
然后给这个文件赋予可执行的权限:
yuanyu@ymac:phpworkspace $ chmod u+x ./test_run.php
接下来就可以直接执行这个脚本了:
yuanyu@ymac:phpworkspace $ ./test_run.php
Here is some plain text.
Here is the file name:
./test_run.php
yuanyu@ymac:phpworkspace $
这种方式在 PHP 官方文档中也是有说的,请参考:
http://php.net/manual/en/features.commandline.usage.php
文档中的
“Example #2 Script intended to be run from command line (script.php)”
以上就是Unix/Linux中直接执行PHP脚本文件的操作方法,不熟悉的用户可以参照上面介绍的具体步骤来操作。
看过“ Linux怎么直接执行PHP脚本文件 ”
浏览量:3
下载量:0
时间:
以下脚本可用于对服务器进行上传限速,当业务使用处于高峰期时,为不影响业务的正常使用,限制上传速度,保证能正常提供服务。
原理是使用linux中的TC(流量控制模块)实现限速功能。
脚本的使用如下:
启动:sh limit.sh start 200 (限制上传速度为200kb/s)
停止:sh limit.sh stop
#!/bin/bash
#a simple example for "tc"
#set the param
DELAY=20
SPEED=$2
FLOW=0
#出口网卡
NETWORK_CARD=$(ip ro get 115.29.128.27 | grep eth | awk '{print $5}')
#服务器IP
IP_ADDRESS=115.29.128.28
start () {
/sbin/tc qdisc add dev ${NETWORK_CARD} root handle 1: htb default 25
/sbin/tc class add dev ${NETWORK_CARD} parent 1: classid 1:1 htb rate ${SPEED}kbps
/sbin/tc qdisc add dev ${NETWORK_CARD} parent 1:1 netem delay ${DELAY}ms ${FLOW}ms
/sbin/tc filter add dev ${NETWORK_CARD} parent 1: protocol ip prio 1 u32 match ip dst ${IP_ADDRESS}/32 flowid 1:1
}
stop () {
/sbin/tc qdisc dele dev ${NETWORK_CARD} root
}
case "$1" in
start)
start
;;
stop)
stop
;;
*)
echo "Usage: `basename $0` {start|stop} speed(kb/s)"
esac
浏览量:2
下载量:0
时间:
欢迎来到读文网,本文介绍分析Linux系统rc.sysinit脚本,欢迎您阅读。
#!/bin/bash
#
# /etc/rc.d/rc.sysinit - run once at boot time
#
#
# Rerun ourselves through initlog https:// 通过 /sbin/initlog 命令重新运行自己
if [ -z "$IN_INITLOG" -a -x /sbin/initlog ]; then https:// 条件是 :如果 IN_INITLOG 变量的值不为空,且 /sbin/initlog 可执行
exec /sbin/initlog -r /etc/rc.d/rc.sysinit https:// 调用 exec /sbin/initlog ,-r 是表示运行某个程序
fi
######################################################################################################################################################
HOSTNAME=`/bin/hostname` # 取得主机名
HOSTTYPE=`uname -m` # 取得主机类型
unamer=`uname -r` # 取得内核的 release 版本(例如 2.4.9.30-8)
eval version=`echo $unamer | awk -F ‘.‘ ‘{ print "(" $1 " " $2 ")" }‘` # 取得版本号
if [ -f /etc/sysconfig/network ]; then # 如果存在 /etc/sysconfig/network ,则执行该文件。
. /etc/sysconfig/network # network 文件主要控制是否启用网络、默认网关、主机名
fi
if [ -z "$HOSTNAME" -o "$HOSTNAME" = "(none)" ]; then # 如果执行 network 文件后 HOSTNAME 为空或者为 "(none)" ,
HOSTNAME=localhost # 则将主机名设置为 "localhost"
fi
# Mount /proc and /sys (done here so volume labels can work with fsck) # 接下来是挂载 /proc 和 /sys ,这样 fsck 才能使用卷标
mount -n -t proc /proc /proc # -n 表示不写 /etc/mtab ,这在 /etc 所在的文件系统为只读时用。因为此时的/还是只读的
[ -d /proc/bus/usb ] && mount -n -t usbfs /proc/bus/usb /proc/bus/usb # 如果存在 /proc/bus/usb 目录则把 /proc/bus/usb 以 usbfs 挂载到 /proc/bus/usb 下
mount -n -t sysfs /sys /sys >/dev/null 2>&1 # 接下来就是把 /sys 目录以 sysfs 格式挂载到 /sys 目录下
########################################################################################################################################################
. /etc/init.d/functions # 执行 /etc/init.d/functions 文件,该文件提供了很多有用的函数,具体见 “functions 脚本提供的函数”一文
########################################################################################################################################################
#selinux段相关注释,邹立巍(mini.jerry@gmail.com)
# Check SELinux status #检察selinux状态
selinuxfs=`awk ‘/ selinuxfs / { print $2 }‘ /proc/mounts` #找到selinux的状态显示目录,默认为/selinux
SELINUX= #将SELINUX变量初始化
if [ -n "$selinuxfs" ] && [ "`cat /proc/self/attr/current`" != "kernel" ]; then
if [ -r $selinuxfs/enforce ] ; then
SELINUX=`cat $selinuxfs/enforce`
else
# assume enforcing if you can‘t read it
SELINUX=1
fi
fi
#以上if语句显示,当变量selinuxfs的值不为空,且/proc/self/attr/current文件内容不是kernel时(此时说明selinux的状态被设置为打开),
#检查/selinux/enforce是否可读,若可读,则设置SELINUX变量状态为/selinux/enforce文件内容。如果不可读,设置为1。
if [ -x /sbin/restorecon ] && LC_ALL=C fgrep -q " /dev " /proc/mounts ; then
/sbin/restorecon -R /dev 2>/dev/null
fi
#用restorecon命令重新标记/dev目录的安全上下文
disable_selinux() {
echo "*** Warning -- SELinux is active"
echo "*** Disabling security enforcement for system recovery."
echo "*** Run ‘setenforce 1‘ to reenable."
echo "0" > $selinuxfs/enforce
}
#定义函数disable_selinux(),此函数用来将selinux设置为Permissive状态,即selinux的调试状态
relabel_selinux() {
if [ -x /usr/bin/rhgb-client ] && /usr/bin/rhgb-client --ping ; then
chvt 1
fi
#检查主机是否活动,如果活动则切换到tty1上
echo "
*** Warning -- SELinux relabel is required. ***
*** Disabling security enforcement. ***
*** Relabeling could take a very long time, ***
*** depending on file system size. ***
"
echo "0" > $selinuxfs/enforce #将selinux设置为Permissive状态,以便重新标记文件的安全上下文
/sbin/fixfiles -F relabel > /dev/null 2>&1 #用fixfile命令重新标记安全上下文
rm -f /.autorelabel #删除标记时产生的临时文件
echo "*** Enabling security enforcement. ***"
echo $SELINUX > $selinuxfs/enforce #将selinux设置为enforce状态
if [ -x /usr/bin/rhgb-client ] && /usr/bin/rhgb-client --ping ; then
chvt 8
fi
#如过主机处于活动状态,切换到tty8
}
#定义函数relabel_selinux(),此函数用来重新标记所有文件的安全上下文
########################################################################################################################################################
if [ "$HOSTTYPE" != "s390" -a "$HOSTTYPE" != "s390x" ]; then
last=0
for i in `LC_ALL=C grep ‘^[0-9].*respawn:/sbin/mingetty‘ /etc/inittab | sed ‘s/^.* tty([0-9][0-9]*).*/1/g‘`; do
> /dev/tty$i
last=$i
done
if [ $last -gt 0 ]; then
> /dev/tty$((last+1))
> /dev/tty$((last+2))
fi
fi
########################################################################################################################################################
if [ "$CONSOLETYPE" = "vt" -a -x /sbin/setsysfont ]; then # 下面是设置屏幕的默认字体。如果 CONSOLETYPE 变量的值为 vt 且 /sbin/setsysfont 命令可执行
echo -n "Setting default font ($SYSFONT): " # 打印 "setting deafault font xxxx " ,默认字体应该是 xxxx
/sbin/setsysfont # 执行 /sbin/setsysfont
if [ $? -eq 0 ]; then # 如果上述命令执行返回的 exit status 为 0
success # 则调用 success 函数(来自于 functions 脚本),记录一个成功的事件
else
failure # 否则调用 failure 函数
fi
echo ; echo
fi
########################################################################################################################################################
# Print a text banner. # 下面部分是打印 "welcome to xxxxx" 的标题栏
echo -en $"Welcome to " # 打印 "Welcom to" ,同时不换行
if LC_ALL=C fgrep -q "Red Hat" /etc/redhat-release ; then # 从 /etc/redhat-release 文件中找出含有 "Red Hat" 的行,如果找到
[ "$BOOTUP" = "color" ] && echo -en "\033[0;31m" # 则变量 BOOTUP 的值为 color ,并设置输出字体输出红色
echo -en "Red Hat" # 同时打印 "Red Hat" ,接下来打印发行版本(产品)
[ "$BOOTUP" = "color" ] && echo -en "\033[0;39m" # 如果变量 BOOTUP 的值为 color 则设置输出字体为白色
PRODUCT=`sed "s/Red Hat (.*) release.*/1/" /etc/redhat-release` # 从 /etc/redhat-release 中找出含有 "Red Hat" 且后面若干字符,然后是 "release" 的行,并截取中间部分给 PRODUCT
echo " $PRODUCT" # 输出变量 PRODUCT 的值(白色)
elif LC_ALL=C fgrep -q "Fedora" /etc/redhat-release ; then , ; # 如果/etc/redhat-release 中没有 Red Hat 字符串,但有 Fedora ,则执行类似过程
[ "$BOOTUP" = "color" ] && echo -en "\033[0;31m"
echo -en "Fedora"
[ "$BOOTUP" = "color" ] && echo -en "\033[0;39m"
PRODUCT=`sed "s/Fedora (.*) release.*/1/" /etc/redhat-release`
echo " $PRODUCT"
else # 如果 /etc/redhat-release 中既没有含 Red Hat 也没有含 Fedora 的行,则
PRODUCT=`sed "s/ release.*https://g" /etc/redhat-release` # 找到含有 ‘release‘ 的行,并把它前面的部分输出,作为 PRODUCT 变量的值并输出
echo "$PRODUCT"
fi
# 补充 :实际效果是 Red Hat 两个字是红色,其他都是白色
########################################################################################################################################################
if [ "$PROMPT" != "no" ]; then # 如果变量 PROMPT 的值不为 "no" (表示允许交互启动),则
echo -en $"Press ‘I‘ to enter interactive startup." # 打印提示信息“Press I to enter interactive startup”,但此时按 I 还未起作用
echo
fi
########################################################################################################################################################
# 注释 :下面部分是设置输出到 console 的日志的详细级别
# Fix console loglevel # 设置控制台的日志级别
if [ -n "$LOGLEVEL" ]; then # 如果 LOGLEVEL 变量的值不为空
/bin/dmesg -n $LOGLEVEL # 则执行 dmesg ,设置打印到 consoel 的日志的级别为 $LOGLEVEL
fi
########################################################################################################################################################
# 注释 :下面部分是启动 udev 并加载 ide、scsi、network、audio 以及其他类型的设备的模块的部分
[ -x /sbin/start_udev ] && /sbin/start_udev # 如果 /sbin/start_udev 可执行,则执行它,会在屏幕上显示 “Starting udev ... [OK]”
# Only read this once.
cmdline=$(cat /proc/cmdline) # 读取 /proc/cmdline ,这是内核启动的时的参数,赋予变量 cmdline
# Initialize hardware # 下面初始化硬件
if [ -f /proc/sys/kernel/modprobe ]; then # 如果 /proc/sys/kernel/modprobe 文件存在(该文件告诉内核用什么命令来加载模块),则
if ! strstr "$cmdline" nomodules && [ -f /proc/modules ] ; then # 如果 $cmdline 变量的值含有 nomodules ,且存在 /proc/modules 文件,则
sysctl -w kernel.modprobe="/sbin/modprobe" >/dev/null 2>&1 # 使用 sysctl 设置 kernel.modprobe 为 /sbin/modprobe 命令
sysctl -w kernel.hotplug="/sbin/hotplug" >/dev/null 2>&1 # 使用 sysctl 设置 kernel.hotplug 为 /sbin/hotplug 命令
else # 如果不存在 /proc/sys/kernel/modprobe 文件,则
# We used to set this to NULL, but that causes ‘failed to exec‘ messages"
sysctl -w kernel.modprobe="/bin/true" >/dev/null 2>&1 # 使用 sysctl 设置 kernel.modprobe 为 /bin/true
sysctl -w kernel.hotplug="/bin/true" >/dev/null 2>&1 # kernel.hotplug 也一样
fi
fi
########################################################################################################################################################
# 注释 :下面开始真正的加载各种类型的设备的驱动
# 首先是找出那些模块需要被加载,并把模块名按类分别放到 ide、scsi、network、audio、other 5个变量中
echo -n $"Initializing hardware... " # 打印 "initalizing hardware.." (不换行),并开始初始化硬件
ide="" # 下面这些变量都是为了存储的型号,格式为 " ..."
scsi=""
network=""
audio=""
other=""
eval `kmodule | while read devtype mod ; do # 从 kmodule 命令的输出一次读入两个变量 devtype (设备类型)和 mod(模块名)
case "$devtype" in # 根据 devtype 做出适当的选择
"IDE") ide="$ide $mod" # 如果 devtype 的值为 IDE ,则把 mod 加入到现有的 ide 变量的值中
echo "ide="$ide"";; &nb, sp; # 输出 "ide=" 然后是变量 ide 的值
"SCSI") scsi="$scsi $mod" # 如果 devtype 的值为 SCSI ,则把 mod 变量的值加入到 scsi 变量的值中
echo "scsi="$scsi"";; # 输出 "scsi=" 再输出 $scsi
"NETWORK") network="$network $mod" # 下面的 NETWORK 和 AUDIO 也一样
echo "network="$network"";;
"AUDIO") audio="$audio $mod"
echo "audio="$audio"";;
*) other="$other $mod" # 如果是属于 other 类型的则把模块名 $mod 加入到 other 变量的值列表中
echo "other="$other"";;
esac
done`
load_module () { # 定义一个函数名为 load_module
LC_ALL=C fgrep -xq "$1" /etc/hotplug/blacklist 2>/dev/null || modprobe $1 >/dev/null 2>&1 # 在 /etc/hotplug/blacklist 文件中查找是否有指定的模块,如果没有,
} # 再用 modprobe 加载指定的模块
# IDE # 下面开始加载所有 IDE 类型的设备的模块
for module in $ide ; do # 从 ide 变量中每次取出1个值,赋予变量 module
load_module $module # 再用 load_module 函数加载它。如果该模块存在于 /etc/hotplug/blacklist ,则不会被加载(因为存在于黑名单中)
done
# SCSI # SCSI 方面的比较特殊,除了加载 scsi 变量中的模块外,还会从 modprobe -c (显示所有配置)中找出 scsi 卡(hostadapter)的模块
for module in `/sbin/modprobe -c | awk ‘/^alias[[:space:]]+scsi_hostadapter[[:space:]]/ { print $3 }‘` $scsi; do # 从 modprobe -c 中找出所有scsi卡的模块别名,
load_module $module # 并和 scsi 变量一起,通过 for 循环一一加载
done
load_module floppy # 然后加载 floppy 模块
echo -n $" storage" # 输出 "storage" ,表示存储方面的模块加载已经完成
# Network # 接下来是加载网络设备模块
pushd /etc/sysconfig/network-scripts >/dev/null 2>&1 # pushd 是一个 bash 的内建命令,把目录名放入目录堆栈的顶部,并进入指定目录
interfaces=`ls ifcfg* | LC_ALL=C egrep -v ‘(ifcfg-lo|:|rpmsave|rpmorig|rpmnew)‘ | # 找出 network-scripts 目录下所有 lscfg 开头的文件名,排除指定备份和loopback
LC_ALL=C egrep -v ‘(~|.bak)$‘ | # 排除以 ~ 和 .bask 结尾的文件名
LC_ALL=C egrep ‘ifcfg-[A-Za-z0-9._-]+$‘ | # 找出所有以 ifcfg- 开头,并以多个字母/数字结尾的文件名
sed ‘s/^ifcfg-https://g‘ | # 把前缀 ifcfg- 去掉,只留下后面的接口名
sed ‘s/[0-9]/ &/‘ | LC_ALL=C sort -k 1,1 -k 2n | sed ‘s/ https://‘` # 在数字前面加上空格,是类型和编号分离,便于 sort 排序,然后再组合回去
# 目的是按顺序启动接口
for i in $interfaces ; do # 对于在 $interfaces 变量中的每个接口
eval $(LC_ALL=C fgrep "DEVICE=" ifcfg-$i) # 从对应的文件 ifcfg-$i 找出 DEVICE= 行
load_module $DEVICE # 然后用 load_module 加载它,注意,DEVICE= 行可以是别名,例如 eth1.n7css
done
popd >/dev/null 2>&1 # 把 network-scripts 从目录名堆栈中弹出,并返回原来的目录
for module in $network ; do # 剩下还有 network 变量中的模块
load_module $module # 也一一加载
done
echo -n $" network" # 输出 network 字符串,表示加载网络设备模块工作完毕
# Sound
for module in `/sbin/modprobe -c | awk ‘/^alias[[:space:]]+snd-card-[[:digit:]]+[[:space:]]/ { print $3 }‘` $audio; do # 和 scsi 一样,加载在 modprobe -c 和 audio 变量
load_module $module # 中的模块
done
echo -n $" audio" &nbs, p; # 输出 audio ,表示声卡设备驱动加载完毕,一般会有多个驱动被加载
# Everything else (duck and cover) # 剩下的就是 other 类型的设备了
for module in $other ; do
load_module $module # 这个直接用 load_moudle 函数加载了
done
echo -n $" done" # 输出 done 表示完成
success # 调用 success 函数,记录该事件
echo
########################################################################################################################################################
# 注释 :下面是启用 Software-RAID 的检测
echo "raidautorun /dev/md0" | nash --quiet # 用 nash (小型脚本解释器)执行 "raidautorun /dev/md0" 命令,对所有paritition ID 为 0xFD 分区进行检查
########################################################################################################################################################
# Start the graphical boot, if necessary; /usr may not be mounted yet, so we # 显示图形模式的启动画面,但由于 rhgb 命令在 /usr 分区上,
# may have to do this again after mounting # 这时 /usr 分区还没有被挂载,所以在挂载后重新做一遍这部分脚本
RHGB_STARTED=0 # 初始化 RHGB_STARTED 变量的值为 0,表示尚未启动。RHGB 是 redhat graphical boot 的含义,
mount -n /dev/pts # 挂载 /dev/pts ,类型是 devpts ,目的是获得 pty ,这是一种伪文件系统
if strstr "$cmdline" rhgb && [ "$BOOTUP" = "color" -a "$GRAPHICAL" = "yes" -a -x /usr/bin/rhgb ]; then # 如果内核启动参数 $cmdline 含有 rhgb ,且
# BOOTUP 变量的值为 color ,且 GRPAHICAL 变量的值为 yes
# 且 /usr/bin/rhgb 文件存在并可执行
LC_MESSAGES= /usr/bin/rhgb # 把 "/usr/sbin/rhgb" 赋予变量 LC_MESSAGES
RHGB_STARTED=1 # RHGB_STARTED 变量的值为1。
fi
########################################################################################################################################################
# 注释 :下面部分是使用 sysctl 设置内核的参数
# Configure kernel parameters
update_boot_stage RCkernelparam # 调用 update_boot_stage 函数,该函数由 /etc/rc.d/init.d/functions 脚本定义,主要执行 "/usr/sbin/rhgb-client --update $1"
action $"Configuring kernel parameters: " sysctl -e -p /etc/sysctl.conf # 调用 action 函数,执行 sysctl 命令,它读取 /etc/sysctl.conf ,同时输出 “Configuring kernel
# parameters” 字符串,action 函数也是由 /etc/rc.d/init.d/functions 脚本定义
# 补充 :action 函数的作用是把第一个参数 $1 赋予变量 string 并输出到屏幕,同时把该字符串也写入 /etc/rhgb/temp/rhgb-console
# 然后把 $1 后面的部分作为命令交给 initlog 执行,并根据结果调用 success 或者 failure 函数。而 success 或者 failure 函数又会根据结果输出 [ OK ] 或者 [ FAILED ] 。
# 除了 success 和 failure 函数外,functions 脚本还定义了 passed 和 warnning 函数,它们又分别调用 echo_passwd() 和 echo_warnning()函数,
# 以输出 [ PASSED ] 和 [ WARNNING ]
########################################################################################################################################################
# 注释 :下面设置系统的硬件时钟
# Set the system clock. # 接下来设置系统时钟
update_boot_stage RCclock # 同样是告诉 update_boot_stage 该事件(执行 /usr/bin/rhgb-client --update="$1" 命令,这里 $1 就是 "RCclock")
ARC=0
SRM=0
UTC=0
if [ -f /etc/sysconfig/clock ]; then # 如果存在 /etc/sysconfig/clock 则执行该文件
. /etc/sysconfig/clock
# convert old style clock config to new values
if [ "${CLOCKMODE}" = "GMT" ]; then # 如果变量 CLOCKMODE 为旧式的 GMT 格式
UTC=true # 则 UTC 变量的值为 ture
elif [ "${CLOCKMODE}" = "ARC" ]; then # 如果 CLOCKMODE 的值是 ARC ,则
ARC=true # ARC 的值为 true
fi &nbs, p; # 如果 CLOCKMODE 不等于 GMT 或者 UTC ,则 UTC 的值等于 /etc/sysconfig/clock 中的值,一般都是 false
fi # 如果 CLOCKMODE 不等于 GMT 后者 ARC ,则 UTC 的值为 0
CLOCKDEF="" # CLOCKDEF 变量的值默认为空
CLOCKFLAGS="$CLOCKFLAGS --hctosys" # 而 CLOCKFLAGS 变量的值为原来的值(可能为空)加上 ‘--hctosys‘ ,表示把硬件时钟写入内核时钟
case "$UTC" in # 根据 UTC 变量的值进行选择
yes|true) CLOCKFLAGS="$CLOCKFLAGS --utc" # 如果 UTC 的值为 yes 或者 true,则变量 CLOCKFLAGS 的值加上 --utc ,表示采用 UTC 时区
CLOCKDEF="$CLOCKDEF (utc)" ;; # 同时变量 CLOCKDEF 的值加上 "(utc)"
no|false) CLOCKFLAGS="$CLOCKFLAGS --localtime" # 如果变量 UTC 的值为 false 或者 no,则
CLOCKDEF="$CLOCKDEF (localtime)" ;; # CLOCKDEF 的值加上 "(localtime)" 。由于安装 OS时没有选择 UTC,CLOCKDEF 的值一般最后就是 (localtime) 而已
esac
case "$ARC" in # 根据 ARC 变量的值来选择
yes|true) CLOCKFLAGS="$CLOCKFLAGS --arc" # 如果是 yes 或者 true ,则 CLOCKFLAGS 的值加上 --arc ,CLOCKDEF 的值加上 ‘(arc)‘
CLOCKDEF="$CLOCKDEF (arc)" ;; # 如果 ARC 的值为 0 ,则 CLOCKFLAGS 和 CLOCKDEF 的值都不变
esac
case "$SRM" in # 如果 SRM 的值是 yes 或者 true ,则 CLOCKFLAGS 的值加上 "--srm" ,CLOCKDEF 加上 "(srm)"
yes|true) CLOCKFLAGS="$CLOCKFLAGS --srm"
CLOCKDEF="$CLOCKDEF (srm)" ;;
esac
/sbin/hwclock $CLOCKFLAGS # 执行 hwclock $CLOCKFLAGS 命令,一般就是 /sbin/hwclock --hctosys
action $"Setting clock $CLOCKDEF: `date`" date # 并输出 "setting clock " 和 $CLOCKDEF ,并执行 date 输出当前时间,然后输出 [ OK ]
########################################################################################################################################################
# 注释 :下面部分是设置 key map
if [ "$CONSOLETYPE" = "vt" -a -x /bin/loadkeys ]; then # 接下来是设置 keymap ,一般都是 us
KEYTABLE= # 设置 KEYTABLE 和 KEYMAP
KEYMAP=
if [ -f /etc/sysconfig/console/default.kmap ]; then # 假如存在 /etc/sysconfig/console/default.kmap ,则
KEYMAP=/etc/sysconfig/console/default.kmap # KEYMAP 变量的值为 /etc/sysconfig/console/default.kmap
else # 否则
if [ -f /etc/sysconfig/keyboard ]; then # 如果存在 /etc/sysconfig/keyboard 文件,则执行它
. /etc/sysconfig/keyboard # 该文件设置 KEYTABLE 变量的值,例如 KEYTABLE="/usr/lib/kbd/keytables/us.map
fi
if [ -n "$KEYTABLE" -a -d "/lib/kbd/keymaps" ]; then # 如果 KEYTABLE 的值不为空,且存在 /lib/kbd/keymaps/ 目录,则
KEYMAP="$KEYTABLE.map" # KEYMAP 的值为 KEYTABLE 的值加上 ".map"
fi
fi
if [ -n "$KEYMAP" ]; then # 假如 KEYMAP 变量的值不为空(间接表示 KEYTABLE 不为空且存在 keymaps 目录)
# Since this takes in/output from stdin/out, we can‘t use initlog
if [ -n "$KEYTABLE" ]; then # 且 KEYTABLE 的值不为空
echo -n $"Loading default keymap ($KEYTABLE): " # 则输出 "Loading default keymap xxxx"
else
echo -n $"Loading default keymap: " # 否则只输出 Loading default keymap
fi
loadkeys $KEYMAP /dev/tty0 2>/dev/null && # 接下来用 loadkeys 加载 $KEYMAP 指定的键盘映射文件。
success $"Loading default keymap" || failure $"Loading default keymap" # 如果成功则调用 success 函数,否则调用 failure 函数
echo
fi
fi
########################################################################################################################################################
# 注释 :下面部分是设置主机名
# Set the hostname. # 接下来是设置主机名
update_boot_stage RChostname # 告诉 update_boot_stage 函数该事件,以执行 /usr/sbin/rhgb-client --update RChostname 命令
action $"Setting hostname ${HOSTNAME}: " hostname ${HOSTNAME} # 打印 "setting hostname xxxx" 字符串,并执行 hostname ${HOSTNAME}设置主机名
&, nbsp; # 注意,HOSTNAME 变量前面已经有过赋值的了,就是 `/bin/hostname` 命令返回的值
########################################################################################################################################################
# 注释 :下面设置 ACPI 部分
# Initialiaze ACPI bits
if [ -d /proc/acpi ]; then # 如果存在 /proc/acpi 目录,则
for module in /lib/modules/$unamer/kernel/drivers/acpi/* ; do # 对于在 /lib/moduleshttps://kernel/drivers/acpi/ 目录下的所有模块文件,
insmod $module >/dev/null 2>&1 # 都用 insmod 命令加载到内核中
done
fi
########################################################################################################################################################
# 注释 :下面是主要的部分,就是确认是否需要对 / 文件系统进行 fsck
if [ -f /fastboot ] || strstr "$cmdline" fastboot ; then # 接下来是看对 / 系统进行 fsck 的时候了。如果不存在 /fastboot 文件则看 cmdline 变量是否含有 fastboot 字符串
fastboot=yes # 如果有,则 fastboot 变量的值为 yes。/fastboot 是由 shutdown -f 创建的,表示重启时不作 fsck
fi
if [ -f /fsckoptions ]; then # 如果存在 /fsckoptions 文件,则把文件的内容赋予变量 fsckoptions 变量
fsckoptions=`cat /fsckoptions`
fi
if [ -f /forcefsck ] || strstr "$cmdline" forcefsck ; then # 如果不存在 /forcefsck 文件,则检查 cmdline 变量是否含有 forcefsck 字符串,如果有
fsckoptions="-f $fsckoptions" # 则在 fsckoptions 的值前面加上 "-f" 。/forcefsck 是由 shutdown -F 创建的,强制 fsck
elif [ -f /.autofsck ]; then # 如果存在 /.autofsck
if [ -x /usr/bin/rhgb-client ] && /usr/bin/rhgb-client --ping ; then # 且文件 /usr/bin/rhgb-clinet 可执行,且 /usr/bin/rhgb 服务在运行(--pnig),则
chvt 1 # 切换到虚拟控制台 #1 (主要是显示 fsck 的信息用)
fi
echo $"Your system appears to have shut down uncleanly" # 并显示需要 fsck 的信息 “You system appears to have shut down uncleanly”
AUTOFSCK_TIMEOUT=5 # 设置超时时间为5秒
[ -f /etc/sysconfig/autofsck ] && . /etc/sysconfig/autofsck # 如果存在 /etc/sysconfig/autofsck 则执行它
if [ "$AUTOFSCK_DEF_CHECK" = "yes" ]; then # 如果执行该文件后 AUTOFSCK_DEF_CHECK 变量的值为 yes ,则
AUTOFSCK_OPT=-f # 变量 AUTOFSCK_OPT 的值为 "-f"
fi
if [ "$PROMPT" != "no" ]; then https:// 如果 PROMPT 的值不为 no ,则
if [ "$AUTOFSCK_DEF_CHECK" = "yes" ]; then https:// 且 AUTOFSCK_DEF_CHECK 的值为 yes
if /sbin/getkey -c $AUTOFSCK_TIMEOUT -m $"Press N within %d seconds to not force file system integrity check..." n ; then https:// 执行 getkey 命令,超时5秒,并
https:// 提示5秒内按下 n 键可跳过 fsck
AUTOFSCK_OPT= https:// 如果用户按下 n ,则 AUTOFSCK_OPT 的值为空,表示取消自动 fsck
fi
else https:// 如果 AUTOFSCK_DEF_CHECK 的值不为 yes ,则提示5秒内按y 可以强制 fsck
if /sbin/getkey -c $AUTOFSCK_TIMEOUT -m $"Press Y within %d seconds to force file system integrity check..." y ; then https:// 同样是用 getkey 捕捉 y 键
AUTOFSCK_OPT=-f https:// 如果用户按下了 y 键,则 AUTOFSCK_OPT 的值为 "-f"
fi
fi
echo
else https:// 如果 PROMPT 的值为 "no", 这是用户无法选择是否 fsck
# PROMPT not allowed
if [ "$AUTOFSCK_DEF_CHECK" = "yes" ]; then # 取决于 AUTOFSCK_DEF_CHECK 变量的值,如果是 yes ,则
echo $"Forcing file system integrity check due to default setting" # 提示由于默认的设置强制 fsck 。可能是 mount 次数达到限制,或者多长时间没有 fsck 了
else
echo $"Not forcing file system integrity check due to default setting" # 如果 AUTOFSCK_DEF_CHECK 的值为 no ,则表示不做 fsck
fi
fi
fsckoptions="$AUTOFSCK_OPT $fsckoptions"
fi
# 注释 :注意!到这里为止并没有执行 fsck 操作,只是判断是否需要执行 fsck 以及 fsck 命令的选项
if [ "$BOOTUP" = "color" ]; then # 如果 BOOTUP 的值为 color ,则
fsckoptions="-C $fsckoptions" # -C 表示显示 fsck 进度信息
else # 否则
fsckoptions="-V $fsckoptions" # -V 表示显示 verbose 信息
fi
if [ -f /etc/sysconfig/readonly-root ]; then # 如果存在 /etc/sysconfig/readonly-root ,则
. /etc/sysconfig/readonly-root # 执行该文件
if [ "$READONLY" = "yes" ]; then # 如果 READONLY 变量的值为 yes ,则
# Call rc.readonly to set up magic stuff needed for readonly root # 执行 /etc/rc.readonly 脚本
. /etc/rc.readonly
fi
fi
#########################################################################################################################################################
# 注释 :下面开始判断 / 文件系统的类型(是本地还是 nfs 格式)。如果是nfs则不执行 fsck ,否则继续
_RUN_QUOTACHECK=0 # 初始化 RUN_QUOTACHECK 的值为0.这里是作一个标记,因为后面的代码可能会导致重启。在这里做好标记
# 如果后面没有重启,就可以把 _RUN_QUOTACHECK 设置为1
ROOTFSTYPE=`awk ‘/ / / && ($3 !~ /rootfs/) { print $3 }‘ /proc/mounts` # 从 /proc/mounts 中找出 / 文件系统的类型,并赋予变量 ROOTFSTYPE
# 注释 :下面用到 -z "$fastboot" ,如果有 /fastboot ,则 fastboot 的值为 yes, 所以就不合 if 的条件,则跳过 fsck 。这就是 shutdown -f 快速启动的效果
if [ -z "$fastboot" -a "$READONLY" != "yes" -a "X$ROOTFSTYPE" != "Xnfs" -a "X$ROOTFSTYPE" != "Xnfs4" ]; then # 如果fastboot 变量的值为空且 READONLY 变量不为 yes
# 且 / 文件系统的类型不是 nfs 或者 nfs4 ,则
STRING=$"Checking root filesystem" # 初始化 string 变量并输出 "checking root filesystem"
echo $STRING
rootdev=`awk ‘/ / / && ($3 !~ /rootfs/) {print $1}‘ /proc/mounts` # 从 /proc/mounts 中找出 / 文件系统所在的设备,并赋予 rootdev 变量(例如 /dev/hdb2)
if [ -b /initrd/"$rootdev" ] ; then # 如果 /initrd/$rootdev 是一个 block 设备
rootdev=/initrd/"$rootdev" # 则 rootdev 就是 /initrd/rootdev
else # 否则 rootdev 就是 / ,正常情况应该是执行该步的,也就是 rootdev 最终为 /
rootdev=/ # rootdev 的值为 / ,因为 fsck 支持用 LABEL、mount point、device name 来指定要检查的文件系统
fi
# 注释 : 下面开始真正的 fsck 操作
if [ "${RHGB_STARTED}" != "0" -a -w /etc/rhgb/temp/rhgb-console ]; then # 如果 RHGB_STARTED 不为0且 /etc/rhgb/tmp/rhgb-console 文件可写,则
fsck -T -a $rootdev $fsckoptions > /etc/rhgb/temp/rhgb-console # 执行 fsck 命令,-T 表示不打印标题栏,-a 表示自动修复错误,设备是 / ,后面是选项
# 且信息写入 /etc/rhgb/temp/rhgb-console
else # 否则
initlog -c "fsck -T -a $rootdev $fsckoptions" # 调用 initlog 执行 fsck ,信息直接输出到屏幕,fsck 命令本身都是一样的。
fi
rc=$? # 把 fsck 的结果送给变量 rc
if [ "$rc" -eq "0" ]; then # 如果 rc的值为0,表示 fsck 成功通过
success "$STRING" # 则调用 success 打印 "checking root fileysyes [OK]"
echo
elif [ "$rc" -eq "1" ]; then # 如果 rc 为1 ,则打印 passed ,表示有错误但修复
passed "$STRING" # 这时调用的是 passed 函数(由 /etc/rc.d/init.d/functions 脚本定义,输出 "checking root filesystems [ PASSED ]")
echo
elif [ "$rc" -eq "2" -o "$rc" -eq "3" ]; then # 如果 rc 为 2 (表示系统应该重启)或者为 3(为 1+2 ,表示系统错误已修复,但需要重启)
echo $"Unmounting file systems" # 提示卸载 / 文件系统
umount -a # 把所有卸载,当然 / 除外
mount -n -o remount,ro / # 把 / 设备已 ro 模式重新 mount
echo $"Automatic reboot in progress." # 然后提示将要自动重启了
&, nbsp; reboot -f # 在这里执行 reboot -f ,强制重启
fi # 这个 fi 是结束 "[ "$rc" -eq "0" ]; " 的
# A return of 4 or higher means there were serious problems. # 如果 fsck 返回的值大于4(不含4,4表示错误未修复),则表示 / 文件系统出现重大错误,无法继续
if [ $rc -gt 1 ]; then # 这里之所以用 -gt 1 ,是因为如果前面返回2或者3就会自动重启了,如果执行到这里说明 rc 的值必须至少大于等于4
if [ -x /usr/bin/rhgb-client ] && /usr/bin/rhgb-client --ping ; then # 如果 rhgb-client 可执行且 rhgb 服务在运行
chvt 1 # 强制切换到 1# 虚拟控制台
fi
failure "$STRING" # 调用 failure 函数,打印 "checking root filesystem [ FAILURE ]"
echo
echo
echo $"*** An error occurred during the file system check." # 提示 fsck 过程出错
echo $"*** Dropping you to a shell; the system will reboot" # 提示将进入紧急模式的 shell
echo $"*** when you leave the shell." # 当你退出该 shell 时会自动重启
str=$"(Repair filesystem)" # 设置紧急模式下的 shell 提示符
PS1="$str # # "; export PS1 # 设置提示符变量 PS1 为 "(Repair filesystem) # " , 表示当前是第几个命令
[ "$SELINUX" = "1" ] && disable_selinux
sulogin # 自动执行 sulogin ,这不是 su ,而是 single-user login 的意思,自动进入单用户模式的 shell
# 注意这里将进入一个交互式的 shell 。只有你执行 exit 命令,才会执行下面的代码,否则下面的代码根本不会被执行
echo $"Unmounting file systems" # 提示卸载文件系统
umount -a # 卸载所有文件系统,/ 除外
mount -n -o remount,ro / # / 以 ro 模式挂载
echo $"Automatic reboot in progress." # 提示将自动重启
reboot -f # 立即重启
elif [ "$rc" -eq "1" ]; then # 如果 rc 的值等于1 ,则表示错误修复完毕
_RUN_QUOTACHECK=1 # 如果上面的 fsck 没有出错,自然就不会重启,所以这里把 _RUN_QUOTACHECK 的值设置为1,表示可以进行 quotacheck 了
fi # 这个 fi 是结束 " [ $rc -gt 1 ]; " 的
if [ -f /.autofsck -a -x /usr/bin/rhgb-client ] && /usr/bin/rhgb-client --ping ; then # 如果 rhgb-clinet 可运行且 rhgb 服务在运行
chvt 8 # 则切换换 8# 控制台,也就是图形
fi
fi # 这个 fi 是结束前面的 ”[ -z "$fastboot" -a "$READONLY" != "yes" -a "X$ROOTFSTYPE" != "Xnfs" -a "X$ROOTFSTYPE" != "Xnfs4" ]; “ 的
# 所以如果存在 /fastboot 文件,就直接跳转到这里
########################################################################################################################################################
# 注释 :在 initrd 的 /linuxrc 或者 /init 脚本中会把初始/文件系统卸载掉,如果没有卸载完全,则在这里会重新做一次
# Unmount the initrd, if necessary # 接下来是卸载 initrd 初始/ 文件系统,一般 /init 都会在结尾 umount /initrd/dev 的
if LC_ALL=C fgrep -q /initrd /proc/mounts && ! LC_ALL=C fgrep -q /initrd/loopfs /proc/mounts ; then # 如果 /proc/mounts 文件还有 /initrd/proc 条目,
# 且不存在 /initrd/loops 条目,则
if [ -e /initrd/dev/.devfsd ]; then # 如果存在 /initrd/dev/.devfsd 文件,则
umount /initrd/dev # 卸载 /initrd/dev 目录
fi
umount /initrd # 最后把整个 /initrd 卸载
/sbin/blockdev --flushbufs /dev/ram0 >/dev/null 2>&1 # 最后用 blockdev --flushbs 命令清除 /dev/ram0 的内容,该社备就是被挂载为初始/的
fi
######################################################################################################################################################## # 注释 :下面是对 / 进行 quota 检查,其他文件系统暂时不执行 quotacheck
# Possibly update quotas if fsck was run on /. # 如果 fsck 已经对 / 进行了检查,则执行 quotacheck 更新 quota 情况
LC_ALL=C grep -E ‘[[:space:]]+/[[:space:]]+‘ /etc/fstab | # 在 /etc/fstab 中找出 / 文件系统所在的行,并打印第4个字段(属性)
awk ‘{ print $4 }‘ | # 这是属性字段
LC_ALL=C fgrep -q quota # 找出是否有 quota 字符串,不管是 usrquota 还是 grpquota
_ROOT_HAS_QUOTA=$? # 把结果赋予 _ROOT_HAS_QUOTA 变量
if [ "X$_RUN_QUOTACHECK" = "X1" -a # 如果 x$_RUN_QUOTACHECK 返回 X1 ,且
"X$_ROOT_HAS_QUOTA" = "X0" -a # X$_ROOT_HAS_QUOTA 返回 X0 ,则表示当前可以执行 quotacheck ,且 / 也启用了 quota
-x /sbin/quotacheck ]; then # 如果存在 quotacheck 命令
if [ -x /sbin/convertquota ]; then # 如果存在 convertquota 命令
if [ -f /quota.user ]; then # 且存在 /quota.user 则
action $"Converting old user quota files: " # 并调用 action 函数,打印提示信息,用 convertquota 转换成 v2 格式的 aquota.user 文件
/sbin/convertquota -u / && rm -f /quota.user # 然后删除 v1格式的 /quota.user
fi
if [ -f /quota.group ]; then # 同样对 /quota.group 转换成 v2 格式的 aquota.group,并删除 /quota.group 文件
action $"Converting old group quota files: "
/sbin/convertquota -g / && rm -f /quota.group # 同样在转换后删除旧的 v1 的 group quota 文件
fi
fi
action $"Checking root filesystem quotas: " /sbin/quotacheck -nug / # 然后执行 quotacheck -nug / 对 / 文件系统进行检查,并打印提示信息
fi # 这个 fi 是结束 "[ "X$_RUN_QUOTACHECK" = "X1" -a "X$_ROOT_HAS_QUOTA" = "X0" -a -x /sbin/quotacheck ]; " 的
########################################################################################################################################################
# 注释 :下面这个部分是设置 ISA 设备的,不过由于现在基本没有 ISA 设备了,所以可以跳过该部分,甚至可以在内核中指定不支持 ISA
if [ -x /sbin/isapnp -a -f /etc/isapnp.conf -a ! -f /proc/isapnp ]; then
# check for arguments passed from kernel
if ! strstr "$cmdline" nopnp ; then
PNP=yes
fi
if [ -n "$PNP" ]; then
action $"Setting up ISA PNP devices: " /sbin/isapnp /etc/isapnp.conf
else
action $"Skipping ISA PNP configuration at users request: " /bin/true
fi
fi
########################################################################################################################################################
# Remount the root filesystem read-write. # 现在 / 文件系统 fsck 过了,可以按照 read-write 的模式挂载了
update_boot_stage RCmountfs # 告诉 rhgb 服务器更新 RCmountfs 服务的状态
state=`awk ‘/ / / && ($3 !~ /rootfs/) { print $4 }‘ /proc/mounts` # 从 /proc/mounts 中找出 ‘ / ‘ 字符串并且第3个字段不等于 ‘rootfs‘,则打印其第4个字段,赋予 state
[ "$state" != "rw" -a "$READONLY" != "yes" ] && # 如果 state 变量的值不为 ‘rw‘ 且 READONLY 变量的值为 yes ,则
action $"Remounting root filesystem in read-write mode: " mount -n -o remount,rw / # 用 -o remount -o rw 重新挂载 / 为 rw 模式,并打印提示信息
########################################################################################################################################################
# 注释 :下面开始是 LVM2 的部分了
# LVM2 initialization # 下面部分是 LVM2 的初始化部分
if [ -x /sbin/lvm.static ]; then # 如果存在 /sbin/lvm.static 且可执行
if ! LC_ALL=C fgrep -q "device-mapper" /proc/devices 2>/dev/null ; then # 如果 /proc/devices 文件不含有 device-mapper ,则
modprobe dm-mod >/dev/null 2>&1 # 调用 modprobe 加载 dm-mod
fi
echo "mkdmnod" | /sbin/nash --quiet >/dev/null 2>&1 # 并调用 nash 执行 mkdmmod ,不过是以 quiet 模式执行的
[ -n "$SELINUX" ] && restorecon /dev/mapper/control >/dev/null 2>&1
if [ -c /dev/mapper/control -a -x /sbin/lvm.static ]; then # 假如存在 /dev/mapper/control 这个字符设备且 /sbin/lvm.static 可执行,则
if /sbin/lvm.static vgscan --mknodes --ignorelockingfailure > /dev/null 2>&1 ; then # 调用 lvm.static 执行 vgscan 扫描所有卷组(忽略锁错误)
action $"Setting up Logical Volume Management:" /sbin/lvm.static vgchange -a y --ignorelockingfailure # 如果扫描到卷组,则调用 action 函数,
fi # 打印提示信息,并执行 vgchange -ay 激活全部卷组
fi
fi
# LVM initialization # 这是 LVM1 的部分,因为系统可能同时存在 lVM1 和 lvm2 的 pv
if [ -f /etc/lvmtab ]; then # 如果存在 /etc/lvmtab 文件
[ -e /proc/lvm ] || modprobe lvm-mod > /dev/null 2>&1 # 且 /proc/lvm 文件存在,如果没有则调用 modprobe lvm-mod 加载 lvm-mod ,注意模块名的不同
if [ -e /proc/lvm -a -x /sbin/vgchange ]; then # 如果现在存在 /proc/lvm 文件且 /sbin/vgchange 可执行
action $"Setting up Logical Volume Management:" /sbin/vgscan && /sbin/vgchange -a y # 则调用 action 打印提示信息,并执行 vgchange -ay 激活它们
fi
fi
########################################################################################################################################################
# Clean up SELinux labels
if [ -n "$SELINUX" ]; then
for file in /etc/mtab /etc/ld.so.cache ; do
[ -r $file ] && restorecon $file >/dev/null 2>&1
done
fi
########################################################################################################################################################
# Clear mtab # 由于之前的 /etc/mtab 并不准确,所以现在把它的内容清掉
(> /etc/mtab) &> /dev/null # 用 >/etc/mtab 清空其内容
# Remove stale backups
rm -f /etc/mtab~ /etc/mtab~~ # 删除 /etc/mtab 的备份文件
# Enter root, /proc and (potentially) /proc/bus/usb and devfs into mtab. # 把 root ,/proc ,/proc/bus/usb,devpts 加入到 /etc/mtab 中
mount -f / # -f 表示只更新 /etc/mtab ,但不实际mount,因为这些文件系统在之前都挂载了,没有必要再挂载一次
mount -f /proc
mount -f /sys >/dev/null 2>&1
mount -f /dev/pts
[ -f /proc/bus/usb/devices ] && mount -f -t usbfs usbfs /proc/bus/usb # 如果存在 /proc/bus/usb/devices 文件,则用 mount -f -t usbfs 挂载到 /proc/bus/usb 下
[ -e /dev/.devfsd ] && mount -f -t devfs devfs /dev # 如果存在 /dev/.devfsd ,则同样挂载 devfs 到 /dev 下
########################################################################################################################################################
# configure all zfcp (scsi over fibrechannel) devices before trying to mount them
# zfcpconf.sh exists only on mainframe
[ -x /sbin/zfcpconf.sh ] && /sbin/zfcpconf.sh
########################################################################################################################################################
# The root filesystem is now read-write, so we can now log # 由于之前的 / 是只读的,所以通过 initlog 来记录信息,现在可以通过 syslog 了
# via syslog() directly..
if [ -n "$IN_INITLOG" ]; then
IN_INITLOG= # 如果 IN_INITLOG 的值不为空则清空它
fi
if ! strstr "$cmdline" nomodules && [ -f /proc/modules ] ; then # 如果内核启动参数含有 "nomodules" ,且存在 /proc/modules 文件,则
USEMODULES=y # 把 USEMODULES 设置为 y
fi
# Load modules (for backward compatibility with VARs)
if [ -f /etc/rc.modules ]; then
/etc/rc.modules
浏览量:2
下载量:0
时间:
读文网小编在这里为大家提供五个常用Linux监控脚本(查看主机网卡流量、系统状况监控、监控主机的磁盘空间,当使用空间超过90%就通过发mail来发警告、监控CPU和内存的使用情况、全方位监控主机),有需要的朋友不妨看看这些详细的代码哦!
#!/bin/bash
#script to capture system statistics
OUTFILE=/home/xu/capstats.csv
DATE='date +%m/%d/%Y'
TIME='date +%k:%m:%s'
TIMEOUT='uptime'
VMOUT='vmstat 1 2'
USERS='echo $TIMEOUT | gawk '{print $4}' '
LOAD='echo $TIMEOUT | gawk '{print $9}' | sed "s/,https://' '
FREE='echo $VMOUT | sed -n '/[0-9]/p' | sed -n '2p' | gawk '{print $4} ' '
IDLE='echo $VMOUT | sed -n '/[0-9]/p' | sed -n '2p' |gawk '{print $15}' '
echo "$DATE,$TIME,$USERS,$LOAD,$FREE,$IDLE" >> $OUTFILE
浏览量:2
下载量:0
时间:
Linux的shell脚本提供了大量方便的工具,如:awk、grep、more、tail、wc等等,方便用户对文件、数据的分析,但是windows相对来说就没那么方便,要分析一个数据可能需要自己编程、编译然后才能对一些数据进行分析,对于一些轻量级的数据,不如shell脚本好用。下面就由读文网小编为大家说说如何在windows下使用linux的shell脚本的。
先下载cygwin对应于自己windows操作系统的版本:32位或64位
(cygwin是一个在windows平台上运行的unix模拟环境,是cygnus solutions公司开发的自由软件)
安提示安装好cygwin
打开cygwin,就可以看到熟悉的命令行提示了,shell环境对应的根目录是软件的安装目录
开始使用linux命令:grep、awk、less、vi等等,如果发现有缺少什么命令,重新运行setup.exe安装程序,搜索需求的命令,叉选上即可安装。
以上就是读文网小编为大家提供的解决方法,希望能帮助到大家!!!最后希望大家生活越来越好。
浏览量:2
下载量:0
时间:
写一个脚本auto_coreseek.sh:
代码如下:
#!/bin/sh
#chkconfig:2345 80 90
#description:auto_coreseek
/usr/local/coreseek/bin/searchd
放到/etc/init.d/auto_coreseek.sh
然后chmod +x /etc/init.d/auto_coreseek.sh
然后加到开机启动中:
chkconfig --add auto_coreseek.sh
完事。
然后研究下这都是些毛意思。
chkconfig有几个等级:
0:表示关机
1:表示单用户模式
2:表示无网络链接多用户命令行模式
3:表示有网络链接多用户命令行模式
4:表示不可用情况
5:表示带图形界面的多用户模式
6:表示重新启动
所以chkconfig:2345就代表在2345的等级下启动这个服务
后面的80 90分别是启动优先级和关闭优先级
说说程序的优先级,优先级也很好理解,就是程序被CPU执行的先后顺序,此值越小有限级别越高。所以这里的启动优先级和关闭优先级的意思就是启动脚本这个进程的优先级,和关闭脚本这个进程的优先级。
浏览量:2
下载量:0
时间:
源码如下:
#include
#include
#include
#include
//文件系统信息结构体
struct fileSystem_info{
char fileSystem_format[8];
char fileSystem_total_capacity[11];
char fileSystem_free_capacity[11];
char fileSystem_permissions[3];
};
/*获取文件系统信息*/
int get_fileSystem_info(const char *fileSystem_name, struct fileSystem_info *fi);
/*block to kbyte*/
static unsigned long kscale(unsigned long m_block, unsigned long m_kbyte);
/*convert size to GB MB KB*/
static char *convert_size(float m_size, char *dest);
int main()
{
char buf[1024];
struct fileSystem_info fileSysInfo;
get_fileSystem_info("/",&fileSysInfo);
printf("%s",fileSysInfo.fileSystem_format);
printf("%s",fileSysInfo.fileSystem_free_capacity);
printf("%s",fileSysInfo.fileSystem_total_capacity);
printf("%s",fileSysInfo.fileSystem_permissions);
return 0;
}
/*获取文件系统信息*/
int get_fileSystem_info(const char *fileSystem_name,struct fileSystem_info *fi)
{
struct statfs buf;
float fileSystem_total_size = 0;
float fileSystem_free_size = 0;
if(statfs(fileSystem_name,&buf))
{
fprintf(stderr,"statfs %s",strerror(errno));
return -1;
}
switch(buf.f_type)
{
case 0xEF51:
case 0xEF53:
sprintf(fi->fileSystem_format,"EXT");
break;
case 0x4d44:
sprintf(fi->fileSystem_format,"FAT");
break;
case 0x5346544e:
sprintf(fi->fileSystem_format,"NIFS");
break;
default:
sprintf(fi->fileSystem_format,"unknown");
break;
}
bzero(&fi->fileSystem_total_capacity,sizeof(fi->fileSystem_total_capacity));
bzero(&fi->fileSystem_free_capacity,sizeof(fi->fileSystem_free_capacity));
printf("blocks %ld",buf.f_blocks);
printf("bfree %ld",buf.f_bfree);
printf("bsize %ld",buf.f_bsize);
fileSystem_total_size =
(float)(kscale(buf.f_blocks, buf.f_bsize));
fileSystem_free_size =
(float)(kscale(buf.f_bfree, buf.f_bsize));
printf("total %f",fileSystem_total_size);
printf("free %f",fileSystem_free_size);
convert_size(fileSystem_total_size,fi->fileSystem_total_capacity);
convert_size(fileSystem_free_size,fi->fileSystem_free_capacity);
bzero(fi->fileSystem_permissions,sizeof(fi->fileSystem_permissions));
sprintf(fi->fileSystem_permissions,"rw");
return 0;
}
/*block to kbyte*/
static unsigned long kscale(unsigned long m_block, unsigned long m_kbyte)
{
return ((unsigned long long) m_block * m_kbyte + 1024 / 2 ) /1024;
}
/*convert size to GB MB KB*/
static char *convert_size(float m_size, char *dest)
{
if((((m_size / 1024.0) / 1024.0)) >= 1.0)
{
sprintf(dest,"%0.2fGB",(m_size/1024.0)/1024.0);
}
else if((m_size / 1024.0) >= 1.0)
{
sprintf(dest,"%0.2fMB",(m_size/1024));
}
else
{
sprintf(dest,"%0.2fKB",m_size);
}
return dest;
}
总结:
1、关于 struct statfs 结构体信息参考:http://blog.csdn.net/u011641885/article/details/46919027
2、对于fileSystem_total_size 使用float 类型,是为了精确度更高。buysbox 中的 fdisk 源码使用的是整型相除,约为4舍五入。
3、kscale 函数中 使用 unsigned long long 类型 是因为 m_block 与 m_byte 原本是long 型,相乘的结果超出了 long 类型的可以表示数据位。
浏览量:2
下载量:0
时间:
一、start.sh
#!/bin/bash
cd `dirname $0`
BIN_DIR=`pwd`
cd ..
DEPLOY_DIR=`pwd`
CONF_DIR=$DEPLOY_DIR/conf
SERVER_NAME=`sed '/server.name/!d;s/.*=https://' conf/server.properties | tr -d ''`
SERVER_PORT=`sed '/server.netty.port/!d;s/.*=https://' conf/server.properties | tr -d ''`
if [ -z "$SERVER_NAME" ]; then
SERVER_NAME=`hostname`
fi
PIDS=`ps --no-heading -C java -f --width 1000 | grep "$CONF_DIR" |awk '{print $2}'`
if [ -n "$PIDS" ]; then
echo "ERROR: The $SERVER_NAME already started!"
echo "PID: $PIDS"
exit 1
fi
if [ -n "$SERVER_PORT" ]; then
SERVER_PORT_COUNT=`netstat -tln | grep $SERVER_PORT | wc -l`
if [ $SERVER_PORT_COUNT -gt 0 ]; then
echo "ERROR: The $SERVER_NAME port $SERVER_PORT already used!"
exit 1
fi
fi
LOGS_DIR=""
LOGS_DIR=$DEPLOY_DIR/logs
#if [ ! -d $LOGS_DIR ]; then
# mkdir $LOGS_DIR
#fi
STDOUT_FILE=$LOGS_DIR/stdout.log
LIB_DIR=$DEPLOY_DIR/lib
LIB_JARS=`find $LIB_DIR|grep .jar|awk '{print $0}'|tr "" ":"`
JAVA_OPTS=" -Djava.awt.headless=true -Djava.net.preferIPv4Stack=true "
JAVA_DEBUG_OPTS=""
if [ "$1" = "debug" ]; then
JAVA_DEBUG_OPTS=" -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n "
fi
JAVA_JMX_OPTS=""
if [ "$1" = "jmx" ]; then
JAVA_JMX_OPTS=" -Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false "
fi
JAVA_MEM_OPTS=""
BITS=`file $JAVA_HOME/bin/java | grep 64-bit`
if [ -n "$BITS" ]; then
let memTotal=`cat /proc/meminfo |grep MemTotal|awk '{printf "%d", $2/1024 }'`
if [ $memTotal -gt 2500 ];then
JAVA_MEM_OPTS=" -server -Xmx1024m -Xms1024m -Xmn400m -XX:PermSize=128m -Xss256k -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70 "
else
JAVA_MEM_OPTS=" -server -Xmx1024m -Xms1024m -Xmn400m -XX:PermSize=128m -Xss256k -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70 "
fi
else
JAVA_MEM_OPTS=" -server -Xmx1024m -Xms1024m -XX:PermSize=128m -XX:SurvivorRatio=2 -XX:+UseParallelGC "
fi
echo -e "Starting the $SERVER_NAME ...c"
nohup java $JAVA_OPTS $JAVA_MEM_OPTS $JAVA_DEBUG_OPTS $JAVA_JMX_OPTS -classpath $CONF_DIR:$LIB_JARS com.hzins.framework.server.ServerMain > $STDOUT_FILE 2>&1 &
COUNT=0
while [ $COUNT -lt 1 ]; do
echo -e ".c"
sleep 1
# if [ -n "$SERVER_PORT" ]; then
# COUNT=`echo status | nc 127.0.0.1 $SERVER_PORT -i 1 | grep -c OK`
# else
COUNT=`ps --no-heading -C java -f --width 1000 | grep "$DEPLOY_DIR" | awk '{print $2}' | wc -l`
# fi
if [ $COUNT -gt 0 ]; then
break
fi
done
echo "OK!"
PIDS=`ps --no-heading -C java -f --width 1000 | grep "$DEPLOY_DIR" | awk '{print $2}'`
echo "PID: $PIDS"
#echo "STDOUT: $STDOUT_FILE"
二、stop.sh
#!/bin/bash
cd `dirname $0`
BIN_DIR=`pwd`
cd ..
DEPLOY_DIR=`pwd`
CONF_DIR=$DEPLOY_DIR/conf
SERVER_NAME=`sed '/server.name/!d;s/.*=https://' conf/server.properties | tr -d ''`
if [ -z "$SERVER_NAME" ]; then
SERVER_NAME=`hostname`
fi
PIDS=`ps --no-heading -C java -f --width 1000 | grep "$CONF_DIR" |awk '{print $2}'`
if [ -z "$PIDS" ]; then
echo "ERROR: The $SERVER_NAME does not started!"
exit 1
fi
if [ "$1" != "skip" ]; then
$BIN_DIR/dump.sh
fi
echo -e "Stopping the $SERVER_NAME ...c"
for PID in $PIDS ; do
kill $PID > /dev/null 2>&1
done
COUNT=0
while [ $COUNT -lt 1 ]; do
echo -e ".c"
sleep 1
COUNT=1
for PID in $PIDS ; do
PID_EXIST=`ps --no-heading -p $PID`
if [ -n "$PID_EXIST" ]; then
COUNT=0
break
fi
done
done
echo "OK!"
echo "PID: $PIDS"
三、restart.sh
#!/bin/bash
cd `dirname $0`
./stop.sh
./start.sh
浏览量:2
下载量:0
时间:
如果没有设置DNS服务器的话,那么系统就不能正常上网了。,那么Linux系统怎么查看和修改DNS配置呢?下面读文网小编就为大家带来了Linux系统查看和修改DNS配置的方法。
1:查看/etc/resolv.con文件
[root@localhost ~]# cat /etc/resolv.conf
nameserver 192.168.xxx.xxx
#search localdomain
[root@localhost ~]#
2:使用nslookup命令查看DNS信息
[root@localhost ~]# nslookup 127.0.0.1 | grep Server
Server: 192.168.xxx.xxx
[root@localhost ~]#
3:使用dig命令来查看DNS信息
[root@localhost ~]# dig
; 《《》》 DiG 9.3.6-P1-RedHat-9.3.6-16.P1.el5 《《》》
;; global options: printcmd
;; Got answer:
;; -》》HEADER《《- opcode: QUERY, status: NOERROR, id: 36888
;; flags: qr rd ra; QUERY: 1, ANSWER: 13, AUTHORITY: 0, ADDITIONAL: 3
;; QUESTION SECTION:
;。 IN NS
;; ANSWER SECTION:
。 86163 IN NS m.root-servers.net.
。 86163 IN NS a.root-servers.net.
。 86163 IN NS j.root-servers.net.
。 86163 IN NS l.root-servers.net.
。 86163 IN NS e.root-servers.net.
。 86163 IN NS d.root-servers.net.
。 86163 IN NS k.root-servers.net.
。 86163 IN NS f.root-servers.net.
。 86163 IN NS h.root-servers.net.
。 86163 IN NS c.root-servers.net.
。 86163 IN NS g.root-servers.net.
。 86163 IN NS b.root-servers.net.
。 86163 IN NS i.root-servers.net.
;; ADDITIONAL SECTION:
a.root-servers.net. 3599 IN A 112.4.20.71
b.root-servers.net. 86163 IN A 192.228.79.201
i.root-servers.net. 86173 IN A 192.36.148.17
;; Query time: 8 msec
;; SERVER: 192.168.xxx.xxx#53(192.168.xxx.xxx)
;; WHEN: Sat Apr 16 07:34:37 2016
;; MSG SIZE rcvd: 289
[root@localhost ~]# dig | grep SERVER: | awk -F# ‘{ print $1 }’ | awk -F: ‘{ print $2 }’
192.168.xxx.xxx
4:其它一些方法查看DNS信息
在网上看到还有一些其他方法,查看服务器的DNS配置信息,如下所示,不过这些方法,由于环境限制,我没有验证过,仅供参考。
nm-tool | grep DNS
nmcli dev list iface eth0 | grep IP4
浏览量:2
下载量:0
时间:
Linux系统进程在一定条件下可以对任何文件、数据库等进行操作。如果此进程被不法分子用作其他不法用途,将会给系统带来重大危害。那么下面跟着读文网小编来一起了解下Linux系统怎么设置安全管理吧。
1.引导程序安全
Linux系统的root密码是很容易破解的,当然前提是你没有设置引导程序密码,如GRUB或LILO,为了防止通过引导程序破译root密码,强烈建议设置GRUB或LILO的引导密码,可以编辑其配置文件/etc/grub.conf或/etc/lilo.conf,设置password参数。
2.不安全权限设置
大家常见的Linux下文件权限是r w x,其实还有一种权限叫s,如果给某个文件赋予的s权限,那么这个文件在执行的时候就会拥有相应宿主用户或宿主组用户的权限,例如:
#chmod u+s testfile
#ls -la testfile
rwsr----- root root 10 testfile
这样,当这个文件被其它用户执行的时候,此用户就具有了此文件宿主用户root的对testfile的执行权限。类似,当文件的宿主组具有s权限后,执行此文件的用户就具有了此文件宿主组用户对此文件的权限,这是相当危险的。
大家可以试想下,如果命令chmod的文件被赋予了s权限,那么其它用户还有什么事情是不能做的呢?那它就可以更改任何文件的权限了,当然,s权限需要和x权限结合使用,没有x权限的s权限是没有任何意义的。
3.自动注销
当某个用户使用服务器后忘记注销,也是很危险的事情,此时,管理员可以设置/etc/profile文件的timeout参数,当用户一段时间不做任何操作时,系统自动注销此用户。
4. 设置口令复杂度
为了防止系统用户口令过于简单而被破译,可以编辑/etc/login.defs文件,设置系统用户口令复杂度,例如口令最长,最短,过期时间等。
5.禁止不必要用户登陆系统
为了防止其它非系统用户登陆系统,可以在添加用户时,赋予此用户不存在的主目录和不存在的shell环境,当然,最好还更改/etc/passwd和/etc/shadow两个文件的访问权限,使之后root用户可以访问。
Linux系统特点就是因为它是一款免费传播类操作系统,使其具有服务器应有的天然特性,但也正是因为有这些特性,所以在管理不当的情况下,也会造成很严重的安全性问题,所以我们的好好使用它,保护它!
看过“Linux系统怎么设置安全管理”
浏览量:3
下载量:0
时间:
当要传送的文件较大,过程中如果网络中断了,就比较悲剧了。那么Linux下怎么实现断点续传呢?读文网小编分享了Linux下实现断点续传的方法,希望对大家有所帮助。
断点续传的原理
其实断点续传的原理很简单,就是在 Http 的请求上和一般的下载有所不同而已。
打个比方,浏览器请求服务器上的一个文时,所发出的请求如下:
假设服务器域名为 wwww.sjtu.edu.cn,文件名为 down.zip。
GET /down.zip HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-
excel, application/msword, application/vnd.ms-powerpoint, */*
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)
Connection: Keep-Alive
服务器收到请求后,按要求寻找请求的文件,提取文件的信息,然后返回给浏览器,返回信息如下:
200
Content-Length=106786028
Accept-Ranges=bytes
Date=Mon, 30 Apr 2001 12:56:11 GMT
ETag=W/“02ca57e173c11:95b”
Content-Type=application/octet-stream
Server=Microsoft-IIS/5.0
Last-Modified=Mon, 30 Apr 2001 12:56:11 GMT
所谓断点续传,也就是要从文件已经下载的地方开始继续下载。所以在客户端浏览器传给 Web 服务器的时候要多加一条信息 -- 从哪里开始。
下面是用自己编的一个“浏览器”来传递请求信息给 Web 服务器,要求从 2000070 字节开始。
GET /down.zip HTTP/1.0
User-Agent: NetFox
RANGE: bytes=2000070-
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
仔细看一下就会发现多了一行 RANGE: bytes=2000070-
这一行的意思就是告诉服务器 down.zip 这个文件从 2000070 字节开始传,前面的字节不用传了。
服务器收到这个请求以后,返回的信息如下:
206
Content-Length=106786028
Content-Range=bytes 2000070-106786027/106786028
Date=Mon, 30 Apr 2001 12:55:20 GMT
ETag=W/“02ca57e173c11:95b”
Content-Type=application/octet-stream
Server=Microsoft-IIS/5.0
Last-Modified=Mon, 30 Apr 2001 12:55:20 GMT
和前面服务器返回的信息比较一下,就会发现增加了一行:
Content-Range=bytes 2000070-106786027/106786028
返回的代码也改为 206 了,而不再是 200 了。
知道了以上原理,就可以进行断点续传的编程了。
Java 实现断点续传的关键几点
(1) 用什么方法实现提交 RANGE: bytes=2000070-。
当然用最原始的 Socket 是肯定能完成的,不过那样太费事了,其实 Java 的 net 包中提供了这种功能。代码如下:
URL url = new URL(“http://www.sjtu.edu.cn/down.zip”);
HttpURLConnection httpConnection = (HttpURLConnection)url.openConnection();
// 设置 User-Agent
httpConnection.setRequestProperty(“User-Agent”,“NetFox”);
// 设置断点续传的开始位置
httpConnection.setRequestProperty(“RANGE”,“bytes=2000070”);
// 获得输入流
InputStream input = httpConnection.getInputStream();
从输入流中取出的字节流就是 down.zip 文件从 2000070 开始的字节流。 大家看,其实断点续传用 Java 实现起来还是很简单的吧。 接下来要做的事就是怎么保存获得的流到文件中去了。
保存文件采用的方法。
我采用的是 IO 包中的 RandAccessFile 类。
操作相当简单,假设从 2000070 处开始保存文件,代码如下:
RandomAccess oSavedFile = new RandomAccessFile(“down.zip”,“rw”);
long nPos = 2000070;
// 定位文件指针到 nPos 位置
oSavedFile.seek(nPos);
byte[] b = new byte[1024];
int nRead;
// 从输入流中读入字节流,然后写到文件中
while((nRead=input.read(b,0,1024)) 》 0)
{
oSavedFile.write(b,0,nRead);
}
以上就是断点续传的原理,知道这些原理,相信大家都能够进行编程了吧
看过“Linux下怎么实现断点续传”
浏览量:3
下载量:0
时间:
由于业务需要,要在单个物理网卡上建立多个虚拟网卡,那么Linux怎么增加虚拟网卡呢?读文网小编分享了Linux增加虚拟网卡的方法,希望对大家有所帮助。
创建tap
前两种方法都有一个特点,创建的网卡可有不同的ip地址,但是Mac地址相同。无法用来创建虚拟机。
添加虚拟网卡tap
tunctl -b
附上相关命令简介:
显示网桥信息
brctl show
添加网桥
brctl addbr virbr0
激活网桥
ip link set virbr0 up
添加虚拟网卡tap
tunctl -b
tap0 -------》 执行上面使命就会生成一个tap,后缀从0,1,2依次递增
激活创建的tap
ip link set tap0 up
将tap0虚拟网卡添加到指定网桥上。
brctl addif br0 tap0
给网桥配制ip地址
ifconfig virbr1 169.254.251.4 up
将virbr1网桥上绑定的网卡eth5解除
brctl delif virb1 eth5
给virbr1网桥添加网卡eth6
brctl addif virbr1 eth6
看过“Linux怎么增加虚拟网卡”
浏览量:3
下载量:0
时间:
nux系统磁盘提示满了,可是磁盘内文件加起来的大小和被占用的大小不一致,这就是磁盘丢失的情况,那么Linux系统怎么找回丢失磁盘空间?下面读文网小编就给大家介绍下Linux找回丢失磁盘空间的方法。
收到一个磁盘告警,说某某分区已经满了,然后登录服务器 df 一看,发现磁盘确实快满了,然后你就想找到具体是哪个目录满了,于是 du -s * 一看,却发现所有子目录的大小总和却和df显示的总已使用磁盘空间对不上,有时候甚至还相差很多,于是就纳闷了:我的磁盘空间去哪了呢?
这里就列3种情况:
隐藏文件
linux系统把文件名以。(点号)开头的文件视为隐藏文件,而类似bash里*这样的操作符是不会匹配隐藏文件的,所以如果根目录下有个较大的隐藏文件的话,是不会被du -sh * 统计到的,解决办法就是: du -sh 。[^.]* 。
非空目录被mount
一般挂载其他分区的时候都是建议mount到一个空目录的,那么如果mount到一个非空的目录,情况会怎么样呢?比如/mnt目录本来里面是有文件 的,然后执行了sudo mount /dev/sda6 /mnt。其实这个mount命令完全能正常执行,被mount的分区也能正常访问,只是原先在/mnt里的文件,现在已经访问不到了,包括du也看不到 大小了,但是磁盘空间却还是被占着,因为如果你 umount /mnt 以后,原来的文件都还会回来的。
空洞文件
一个文件的大小和所占磁盘空间也不一定完全一致,比如某个程序一直打开着一个叫log的文件在写,而中间有人用 》 log 命令清除了log的内容,就会产生这样的文件。
大多数情况下来看,以上这三种垃圾,电脑中都会隐藏,那些电脑磁盘不大的朋友们可以勤加清理,可以释放一些空间以被储存其他重要的文件。一般这三种方法清理之后,电脑中的垃圾文件就被清理的差不多了,所以是个还蛮有效的方法呢,试试吧!
看过“Linux系统怎么找回丢失磁盘空间”
浏览量:2
下载量:0
时间:
在Linux的系统中经常碰到字符集导致的错误,那么Linux系统怎么配置多语言环境呢?就让读文网小编来告诉大家Linux系统配置多语言环境的方法吧,希望对大家有所帮助。
修改 /etc/sysconfig/i18n 文件,如
LANG=“en_US.UTF-8”,xwindow会显示英文界面,
LANG=“zh_CN.GB18030”,xwindow会显示中文界面。
还有一种方法 cp /etc/sysconfig/i18n $HOME/.i18n修改 $HOME/.i18n 文件,如
LANG=“en_US.UTF-8”,xwindow会显示英文界面,
LANG=“zh_CN.GB18030”,xwindow会显示中文界面。
这样就可以改变个人的界面语言,而不影响别的用户。
修改后的/etc/sysconfig/i18n 文件为:
代码如下:
LANG=“en_US.UTF-8”
SUPPORTED=“zh_CN.GB18030:zh_CN:zh:en_US.UTF-8:en_US:en”
SYSFONT=“latarcyrheb-sun16”
LC_ALL=“en_US.UTF-8”
export LC_ALL
设置完毕后重启或者用rc.local使生效
或修改登录用户的.bash_profile文件加入
代码如下:
export LANG=zh_CN.GB18030
export LANGUAGE=zh_CN.GB18030:zh_CN.GB2312:zh_CN
Ubuntu
比如将Ubuntu 系统语言环境改为英文的en_US.UTF-8:
查看当前系统语言环境,编辑配置文件,将zh_US.UTF-8改为en_US.UTF-8,zh改为en
代码如下:
sudo nano /etc/default/locale
LANG=“en_US.UTF-8”
LANGUAGE=“en_US:en”
CentOS:
方法一、使用光盘或者相当于光盘的媒介
代码如下:
# mount /dev/cdrom /mnt/cdrom
# cd /mnt/cdrom
# rpm -ivh fonts-chinese
方法二、代码如下:
# yum install fonts-chinese
安装好后,设置一下系统的语言,用桌面方式或字符方式均可,修改后包括如下内容即可:
代码如下:
vim /etc/sysconfig/i18n
代码如下:
LANG=“zh_CN.GB2312”
LANGUAGE=“zh_CN.GB18030:zh_CN.GB2312:zh_CN”
SUPPORTED=“zh_CN.GB18030:zh_CN.GB2312:zh_CN.UTF-8:zh:en_US.UTF-8:en_US:en:ja_JP.UTF-8:ja_JP:ja”
SYSFONT=“lat0-sun16”
SYSFONTACM=“8859-15”
上面就是介绍了如何为Linux系统配置多语言环境的基本方法 ,如果你还在为不知如何给Linux系统配置多语言环境而烦恼的话,你们不凡可以按照上面所说的方法去操作,一切已实践行动为主,那就赶紧选择一个你自己喜欢的方法去操作吧!
看过“Linux系统怎么配置多语言环境”
浏览量:3
下载量:0
时间:
有时候我们需要把搭建出来的网站关闭,那么如何关闭Linux服务器上的网站呢?读文网小编分享了关闭Linux服务器上网站的方法,希望对大家有所帮助。
1、打开WDCP服务器管理系统,输入用户名和密码。
2、进入后点击站点列表,找到要关闭的网站。
3、找到右边的操作,用鼠标左键点击【关】。
4、点击【关】会出现关闭提示,点击确定即可。这样就关闭了自己的网站,这个时候你也会发现关闭的网站的操作项变成了【开】,
5、如果你想开启这个网站,找到右边的操作,用鼠标左键点击【开】。
6、点击【开】会出现开启提示,点击确定即可开启网站。
浏览量:2
下载量:0
时间:
less 与more命令类似,都可以通过翻页键查看上下页的内容,那么Linux的翻页命令more和less怎么使用呢?今天读文网小编与大家分享下Linux的翻页命令more和less使用的具体操作步骤,有需要的朋友不妨了解下。
more
more- 在显示器上阅读文件的过滤器[[ ]]
总览 (SYNOPSIS)
more[-dlfpcsu] [-num] [+/ pattern] [+ linenum] [file ...][[ ]]
描述 (DESCRIPTION)
More是 一个 过滤器, 用于 分页 显示 (一次一屏) 文本. 这个 版本 非常 基本. 用户 应该 知道 less(1) 提供了 more(1) 的 模拟, 并且 做了 增强.[[ ]]
选项 (OPTION)
下面 介绍 命令行选项. 选项 可以 从 环境变量MORE中获取 (要 确保 它们 以 短横线 开头 (``-)), 但是 命令行选项 能够 覆盖 它们.
-num
这个选项指定屏幕的行数 (以整数表示).
-d
让 more 给 用户 显示 提示信息 "[Press space to continue, 'q' to quit.]", 当 用户 按下 其他键 时, 显示 "[Press 'h' for instructions.]", 而不是 扬声器 鸣笛.
-l
More 在 通常情况下 把 ^L (form feed) 当做 特殊字符, 遇到 这个字符 就会 暂停. -l 选项 可以 阻止 这种特性.
-f
使 more 计数 逻辑行, 而不是 屏幕行 (就是说, 长行 不会 断到 下一行).
-p
不卷屏, 而是 清除 整个屏幕, 然后 显示 文本.
-c
不卷屏, 而是 从 每一屏的 顶部 开始 显示 文本, 每 显示完 一行, 就 清除 这一行的 剩余部分.
-s
把 重复的空行 压缩成 一个 空行.
-u
防止下划线.
+/
在 显示 每个文件 前, 搜索 +/ 选项 指定的 文本串.
+num
从行号 num 开始显示.
[[ ]]
命令 (COMMAND)
more的交互命令基于 vi(1). 有些命令 以 一个 十进制数字 开始, 在 下面的描述 里 称之为 k. 后面的 描述中, ^X 指 control-X.
h or ?
帮助: 显示 这些 命令 的 摘要. 你 如果 忘掉 所有 其他的命令, 请记住这个.
SPACE
显示 接下来的 k 行文本. 缺省值 是 当前的屏幕大小.
z
显示 接下来的 k 行文本. 缺省值 是 当前的屏幕大小. 参数 成为 新的缺省值.
RETURN
显示 接下来的 k 行文本. 缺省值 是 1. 参数 成为 新的缺省值.
d or ^D
卷屏 k 行. 缺省值 是 当前的 卷屏大小, 初始化为 11. 参数 成为 新的缺省值.
q 或 Q 或 INTERRUPT
退出.
s
向前跳过 k 行文本. 缺省值 是 1.
f
向前跳过 k 屏文本. 缺省值 是 1.
b or ^B
向后跳回 k 屏文本. 缺省值 是 1.
跳到 上一次 搜索 开始 的 地方.
=
显示当前行号.
/ pattern
搜索 第 k 个 符合 正则表达式的 文本串. 缺省值 是 1.
n
搜索 最后 第 k 个 符合 正则表达式的 文本串. 缺省值 是 1.
! or :!
在子 shell 中执行 .
v
启动 /usr/bin/vi, 指向 当前行.
^L
刷新屏幕.
:n
跳到 后面 第 k 个 文件. 缺省值 是 1.
:p
跳到 前面 第 k 个 文件. 缺省值 是 1.
:f
显示 当前文件名 和 行号.
.
重复上次命令.
[[ ]]
环境 (ENVIRONMENT)
More利用 下面的 环境变量 (如果 它们 存在):
MORE
这个变量 设置 你 喜欢的 more 选项.
SHELL
当前使用的 shell (一般说来 就是 登录 shell).
TERM
指定 终端类型, more 用它来 获取 操作屏幕 所需的 终端特性
例:
代码如下:
[root@localhost zhangy]# more test.php #查看文件
[root@localhost zhangy]# netstat -tpnl |more #常用方式,分页显示
less
less 与more命令类似,但可以通过翻页键查看上下页的内容
-b<缓冲区大小> 设置缓冲区的大小
-e 当文件显示结束后,自动离开
-f 强迫打开特殊文件,例如外围设备代号、目录和二进制文件
-g 只标志最后搜索的关键词
-i 忽略搜索时的大小写
-m 显示类似more命令的百分比
-N 显示每行的行号
-o<文件名> 将less 输出的内容在指定文件中保存起来
-Q 不使用警告音
-s 显示连续空行为一行
-S 行过长时间将超出部分舍弃
-x<数字> 将“tab”键显示为规定的数字空格
命令内部操作
按键功能如下:
b 向后翻一页
d 向后翻半页
h 显示帮助界面
Q 退出less 命令
u 向前滚动半页
y 向前滚动一行
空格键 滚动一行
回车键 滚动一页
1) 向前搜索
/ : 使用一个模式进行搜索,并定位到下一个匹配的文本
n : 向前查找下一个匹配的文本
N : 向后查找前一个匹配的文本
2) 向后搜索
? : 使用模式进行搜索,并定位到前一个匹配的文本
n : 向后查找下一个匹配的文本
N : 向前查找前一个匹配的文本
2 全屏导航
ctrl + F :向前移动一屏
ctrl + B :向后移动一屏
ctrl + D :向前移动半屏
ctrl + U :向后移动半屏
3 单行导航
j : 向前移动一行
k : 向后移动一行
4 其它导航
G : 移动到最后一行
g : 移动到第一行
q / ZZ : 退出 less 命令
5 编辑文件
v : 进入编辑模式,使用配置的编辑器编辑当前文件
6 标记导航
当使用 less 查看大文件时,可以在任何一个位置作标记,可以通过命令导航到标有特定标记的文本位置。
ma : 使用 a 标记文本的当前位置
'a : 导航到标记 a 处
7 浏览多个文件
方式一,传递多个参数给 less,就能浏览多个文件。
less file1 file2
方式二,正在浏览一个文件时,使用 :e 打开另一个文件。
less file1
:e file2
当打开多个文件时,使用如下命令在多个文件之间切换
:n - 浏览下一个文件
:p - 浏览前一个文件
例:
代码如下:
[root@localhost zhangy]# less test.php #查看文件
[root@localhost zhangy]# netstat -tpnl |less #常用方式,分页显示
看过“Linux的翻页命令more和less怎么使用”
浏览量:4
下载量:0
时间:
最近有用户反映,在Linux系统下无法访问mysql,那么如何解决Linux系统无法访问mysql呢?读文网小编分享了解决Linux系统无法访问mysql的方法,希望对大家有所帮助。
1、问题及异常
ThreadPoolAsynchronousRunner - com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@75d634ea -- APPARENT DEADLOCK!!! Complete Status:
Managed Threads: 3
Active Threads: 3
Active Tasks:
2、查找原因
费劲周知,确定是MySQL权限的问题
3、解决过程
1》 mysql -uroot -proot mydbName
2》 grant all privileges on *.* to wangs@‘%’ identified by ‘123456’;
3》 flush privileges;
4》 exit;
5》 /etc/init.d/mysql restart
4、命令的说明
进入 mysql ,用户为 root,密码为 root,数据库为 mydbName,-u 意为用户,-p 意为密码,
增加用户 wangs,所有权限,数据库为 *,后面的 .* 不可少,% 代表对所有远程的 IP 地址,如果要限定 IP 地址的话,单独写上 IP 地址,
密码是 123456,注意引号 ‘ 不可少,用来表示是字符串。
以上命令和过程均不可省略。
以上就是Linux系统下无法访问mysql的解决办法,用户在遇到同样故障时可根据问题的异常状况来找出原因,然后再对症下药的解决问题。
看过“如何解决Linux系统无法访问mysql”
浏览量:3
下载量:0
时间: