Linux 下Shell的学习3-优秀demo
优秀的DEMO
cat /etc/init.d/functions -->里面有颜色定义
cat /etc/rc.d/rc.sysinit
cat /etc/init.d/nfs
cat /etc/init.d/portmap
cat /etc/init.d/httpd
0. function文件
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 # -*-Shell-script-*- 2 # 3 # functions This file contains functions to be used by most or all 4 # shell scripts in the /etc/init.d directory. 5 # 6 7 TEXTDOMAIN=initscripts 8 9 # Make sure umask is sane 10 umask 022 11 12 # Set up a default search path. 13 PATH="/sbin:/usr/sbin:/bin:/usr/bin" 14 export PATH 15 16 # Get a sane screen width 17 [ -z "${COLUMNS:-}" ] && COLUMNS=80 18 19 [ -z "${CONSOLETYPE:-}" ] && CONSOLETYPE="$(/sbin/consoletype)" 20 21 if [ -f /etc/sysconfig/i18n -a -z "${NOLOCALE:-}" -a -z "${LANGSH_SOURCED:-}" ] ; then 22 . /etc/profile.d/lang.sh 2>/dev/null 23 # avoid propagating LANGSH_SOURCED any further 24 unset LANGSH_SOURCED 25 fi 26 27 # Read in our configuration 28 if [ -z "${BOOTUP:-}" ]; then 29 if [ -f /etc/sysconfig/init ]; then 30 . /etc/sysconfig/init 31 else 32 # This all seem confusing? Look in /etc/sysconfig/init, 33 # or in /usr/doc/initscripts-*/sysconfig.txt 34 BOOTUP=color 35 RES_COL=60 36 MOVE_TO_COL="echo -en \\033[${RES_COL}G" 37 SETCOLOR_SUCCESS="echo -en \\033[1;32m" 38 SETCOLOR_FAILURE="echo -en \\033[1;31m" 39 SETCOLOR_WARNING="echo -en \\033[1;33m" 40 SETCOLOR_NORMAL="echo -en \\033[0;39m" 41 LOGLEVEL=1 42 fi 43 if [ "$CONSOLETYPE" = "serial" ]; then 44 BOOTUP=serial 45 MOVE_TO_COL= 46 SETCOLOR_SUCCESS= 47 SETCOLOR_FAILURE= 48 SETCOLOR_WARNING= 49 SETCOLOR_NORMAL= 50 fi 51 fi 52 53 # Interpret escape sequences in an fstab entry 54 fstab_decode_str() { 55 fstab-decode echo "$1" 56 } 57 58 # Check if any of $pid (could be plural) are running 59 checkpid() { 60 local i 61 62 for i in $* ; do 63 [ -d "/proc/$i" ] && return 0 64 done 65 return 1 66 } 67 68 __readlink() { 69 ls -bl "$@" 2>/dev/null| awk '{ print $NF }' 70 } 71 72 __fgrep() { 73 s=$1 74 f=$2 75 while read line; do 76 if strstr "$line" "$s"; then 77 echo $line 78 return 0 79 fi 80 done < $f 81 return 1 82 } 83 84 # __umount_loop awk_program fstab_file first_msg retry_msg retry_umount_args 85 # awk_program should process fstab_file and return a list of fstab-encoded 86 # paths; it doesn't have to handle comments in fstab_file. 87 __umount_loop() { 88 local remaining sig= 89 local retry=3 count 90 91 remaining=$(LC_ALL=C awk "/^#/ {next} $1" "$2" | sort -r) 92 while [ -n "$remaining" -a "$retry" -gt 0 ]; do 93 if [ "$retry" -eq 3 ]; then 94 action "$3" fstab-decode umount $remaining 95 else 96 action "$4" fstab-decode umount $5 $remaining 97 fi 98 count=4 99 remaining=$(LC_ALL=C awk "/^#/ {next} $1" "$2" | sort -r) 100 while [ "$count" -gt 0 ]; do 101 [ -z "$remaining" ] && break 102 count=$(($count-1)) 103 usleep 500000 104 remaining=$(LC_ALL=C awk "/^#/ {next} $1" "$2" | sort -r) 105 done 106 [ -z "$remaining" ] && break 107 fstab-decode /sbin/fuser -m $remaining 2>/dev/null | sed -e "s/\b$$\b//" | xargs kill $sig >/dev/null 108 sleep 3 109 retry=$(($retry -1)) 110 sig=-9 111 done 112 } 113 114 # Similar to __umount loop above, specialized for loopback devices 115 __umount_loopback_loop() { 116 local remaining devremaining sig= 117 local retry=3 118 119 remaining=$(awk '$1 ~ /^\/dev\/loop/ && $2 != "/" {print $2}' /proc/mounts) 120 devremaining=$(awk '$1 ~ /^\/dev\/loop/ && $2 != "/" {print $1}' /proc/mounts) 121 while [ -n "$remaining" -a "$retry" -gt 0 ]; do 122 if [ "$retry" -eq 3 ]; then 123 action $"Unmounting loopback filesystems: " \ 124 fstab-decode umount $remaining 125 else 126 action $"Unmounting loopback filesystems (retry):" \ 127 fstab-decode umount $remaining 128 fi 129 for dev in $devremaining ; do 130 losetup $dev > /dev/null 2>&1 && \ 131 action $"Detaching loopback device $dev: " \ 132 losetup -d $dev 133 done 134 remaining=$(awk '$1 ~ /^\/dev\/loop/ && $2 != "/" {print $2}' /proc/mounts) 135 devremaining=$(awk '$1 ~ /^\/dev\/loop/ && $2 != "/" {print $1}' /proc/mounts) 136 [ -z "$remaining" ] && break 137 fstab-decode /sbin/fuser -k -m $sig $remaining >/dev/null 138 sleep 3 139 retry=$(($retry -1)) 140 sig=-9 141 done 142 } 143 144 # __proc_pids {program} [pidfile] 145 # Set $pid to pids from /var/run* for {program}. $pid should be declared 146 # local in the caller. 147 # Returns LSB exit code for the 'status' action. 148 __pids_var_run() { 149 local base=${1##*/} 150 local pid_file=${2:-/var/run/$base.pid} 151 152 pid= 153 if [ -f "$pid_file" ] ; then 154 local line p 155 156 [ ! -r "$pid_file" ] && return 4 # "user had insufficient privilege" 157 while : ; do 158 read line 159 [ -z "$line" ] && break 160 for p in $line ; do 161 [ -z "${p//[0-9]/}" -a -d "/proc/$p" ] && pid="$pid $p" 162 done 163 done < "$pid_file" 164 165 if [ -n "$pid" ]; then 166 return 0 167 fi 168 return 1 # "Program is dead and /var/run pid file exists" 169 fi 170 return 3 # "Program is not running" 171 } 172 173 # Output PIDs of matching processes, found using pidof 174 __pids_pidof() { 175 pidof -c -o $$ -o $PPID -o %PPID -x "$1" || \ 176 pidof -c -o $$ -o $PPID -o %PPID -x "${1##*/}" 177 } 178 179 180 # A function to start a program. 181 daemon() { 182 # Test syntax. 183 local gotbase= force= nicelevel corelimit 184 local pid base= user= nice= bg= pid_file= 185 local cgroup= 186 nicelevel=0 187 while [ "$1" != "${1##[-+]}" ]; do 188 case $1 in 189 '') echo $"$0: Usage: daemon [+/-nicelevel] {program}" 190 return 1;; 191 --check) 192 base=$2 193 gotbase="yes" 194 shift 2 195 ;; 196 --check=?*) 197 base=${1#--check=} 198 gotbase="yes" 199 shift 200 ;; 201 --user) 202 user=$2 203 shift 2 204 ;; 205 --user=?*) 206 user=${1#--user=} 207 shift 208 ;; 209 --pidfile) 210 pid_file=$2 211 shift 2 212 ;; 213 --pidfile=?*) 214 pid_file=${1#--pidfile=} 215 shift 216 ;; 217 --force) 218 force="force" 219 shift 220 ;; 221 [-+][0-9]*) 222 nice="nice -n $1" 223 shift 224 ;; 225 *) echo $"$0: Usage: daemon [+/-nicelevel] {program}" 226 return 1;; 227 esac 228 done 229 230 # Save basename. 231 [ -z "$gotbase" ] && base=${1##*/} 232 233 # See if it's already running. Look *only* at the pid file. 234 __pids_var_run "$base" "$pid_file" 235 236 [ -n "$pid" -a -z "$force" ] && return 237 238 # make sure it doesn't core dump anywhere unless requested 239 corelimit="ulimit -S -c ${DAEMON_COREFILE_LIMIT:-0}" 240 241 # if they set NICELEVEL in /etc/sysconfig/foo, honor it 242 [ -n "${NICELEVEL:-}" ] && nice="nice -n $NICELEVEL" 243 244 # if they set CGROUP_DAEMON in /etc/sysconfig/foo, honor it 245 if [ -n "${CGROUP_DAEMON}" ]; then 246 if [ ! -x /bin/cgexec ]; then 247 echo -n "Cgroups not installed"; warning 248 echo 249 else 250 cgroup="/bin/cgexec"; 251 for i in $CGROUP_DAEMON; do 252 cgroup="$cgroup -g $i"; 253 done 254 fi 255 fi 256 257 # Echo daemon 258 [ "${BOOTUP:-}" = "verbose" -a -z "${LSB:-}" ] && echo -n " $base" 259 260 # And start it up. 261 if [ -z "$user" ]; then 262 $cgroup $nice /bin/bash -c "$corelimit >/dev/null 2>&1 ; $*" 263 else 264 $cgroup $nice runuser -s /bin/bash $user -c "$corelimit >/dev/null 2>&1 ; $*" 265 fi 266 267 [ "$?" -eq 0 ] && success $"$base startup" || failure $"$base startup" 268 } 269 270 # A function to stop a program. 271 killproc() { 272 local RC killlevel= base pid pid_file= delay 273 274 RC=0; delay=3 275 # Test syntax. 276 if [ "$#" -eq 0 ]; then 277 echo $"Usage: killproc [-p pidfile] [ -d delay] {program} [-signal]" 278 return 1 279 fi 280 if [ "$1" = "-p" ]; then 281 pid_file=$2 282 shift 2 283 fi 284 if [ "$1" = "-d" ]; then 285 delay=$2 286 shift 2 287 fi 288 289 290 # check for second arg to be kill level 291 [ -n "${2:-}" ] && killlevel=$2 292 293 # Save basename. 294 base=${1##*/} 295 296 # Find pid. 297 __pids_var_run "$1" "$pid_file" 298 RC=$? 299 if [ -z "$pid" ]; then 300 if [ -z "$pid_file" ]; then 301 pid="$(__pids_pidof "$1")" 302 else 303 [ "$RC" = "4" ] && { failure $"$base shutdown" ; return $RC ;} 304 fi 305 fi 306 307 # Kill it. 308 if [ -n "$pid" ] ; then 309 [ "$BOOTUP" = "verbose" -a -z "${LSB:-}" ] && echo -n "$base " 310 if [ -z "$killlevel" ] ; then 311 if checkpid $pid 2>&1; then 312 # TERM first, then KILL if not dead 313 kill -TERM $pid >/dev/null 2>&1 314 usleep 100000 315 if checkpid $pid && sleep 1 && 316 checkpid $pid && sleep $delay && 317 checkpid $pid ; then 318 kill -KILL $pid >/dev/null 2>&1 319 usleep 100000 320 fi 321 fi 322 checkpid $pid 323 RC=$? 324 [ "$RC" -eq 0 ] && failure $"$base shutdown" || success $"$base shutdown" 325 RC=$((! $RC)) 326 # use specified level only 327 else 328 if checkpid $pid; then 329 kill $killlevel $pid >/dev/null 2>&1 330 RC=$? 331 [ "$RC" -eq 0 ] && success $"$base $killlevel" || failure $"$base $killlevel" 332 elif [ -n "${LSB:-}" ]; then 333 RC=7 # Program is not running 334 fi 335 fi 336 else 337 if [ -n "${LSB:-}" -a -n "$killlevel" ]; then 338 RC=7 # Program is not running 339 else 340 failure $"$base shutdown" 341 RC=0 342 fi 343 fi 344 345 # Remove pid file if any. 346 if [ -z "$killlevel" ]; then 347 rm -f "${pid_file:-/var/run/$base.pid}" 348 fi 349 return $RC 350 } 351 352 # A function to find the pid of a program. Looks *only* at the pidfile 353 pidfileofproc() { 354 local pid 355 356 # Test syntax. 357 if [ "$#" = 0 ] ; then 358 echo $"Usage: pidfileofproc {program}" 359 return 1 360 fi 361 362 __pids_var_run "$1" 363 [ -n "$pid" ] && echo $pid 364 return 0 365 } 366 367 # A function to find the pid of a program. 368 pidofproc() { 369 local RC pid pid_file= 370 371 # Test syntax. 372 if [ "$#" = 0 ]; then 373 echo $"Usage: pidofproc [-p pidfile] {program}" 374 return 1 375 fi 376 if [ "$1" = "-p" ]; then 377 pid_file=$2 378 shift 2 379 fi 380 fail_code=3 # "Program is not running" 381 382 # First try "/var/run/*.pid" files 383 __pids_var_run "$1" "$pid_file" 384 RC=$? 385 if [ -n "$pid" ]; then 386 echo $pid 387 return 0 388 fi 389 390 [ -n "$pid_file" ] && return $RC 391 __pids_pidof "$1" || return $RC 392 } 393 394 status() { 395 local base pid lock_file= pid_file= 396 397 # Test syntax. 398 if [ "$#" = 0 ] ; then 399 echo $"Usage: status [-p pidfile] {program}" 400 return 1 401 fi 402 if [ "$1" = "-p" ]; then 403 pid_file=$2 404 shift 2 405 fi 406 if [ "$1" = "-l" ]; then 407 lock_file=$2 408 shift 2 409 fi 410 base=${1##*/} 411 412 # First try "pidof" 413 __pids_var_run "$1" "$pid_file" 414 RC=$? 415 if [ -z "$pid_file" -a -z "$pid" ]; then 416 pid="$(__pids_pidof "$1")" 417 fi 418 if [ -n "$pid" ]; then 419 echo $"${base} (pid $pid) is running..." 420 return 0 421 fi 422 423 case "$RC" in 424 0) 425 echo $"${base} (pid $pid) is running..." 426 return 0 427 ;; 428 1) 429 echo $"${base} dead but pid file exists" 430 return 1 431 ;; 432 4) 433 echo $"${base} status unknown due to insufficient privileges." 434 return 4 435 ;; 436 esac 437 if [ -z "${lock_file}" ]; then 438 lock_file=${base} 439 fi 440 # See if /var/lock/subsys/${lock_file} exists 441 if [ -f /var/lock/subsys/${lock_file} ]; then 442 echo $"${base} dead but subsys locked" 443 return 2 444 fi 445 echo $"${base} is stopped" 446 return 3 447 } 448 449 echo_success() { 450 [ "$BOOTUP" = "color" ] && $MOVE_TO_COL 451 echo -n "[" 452 [ "$BOOTUP" = "color" ] && $SETCOLOR_SUCCESS 453 echo -n $" OK " 454 [ "$BOOTUP" = "color" ] && $SETCOLOR_NORMAL 455 echo -n "]" 456 echo -ne "\r" 457 return 0 458 } 459 460 echo_failure() { 461 [ "$BOOTUP" = "color" ] && $MOVE_TO_COL 462 echo -n "[" 463 [ "$BOOTUP" = "color" ] && $SETCOLOR_FAILURE 464 echo -n $"FAILED" 465 [ "$BOOTUP" = "color" ] && $SETCOLOR_NORMAL 466 echo -n "]" 467 echo -ne "\r" 468 return 1 469 } 470 471 echo_passed() { 472 [ "$BOOTUP" = "color" ] && $MOVE_TO_COL 473 echo -n "[" 474 [ "$BOOTUP" = "color" ] && $SETCOLOR_WARNING 475 echo -n $"PASSED" 476 [ "$BOOTUP" = "color" ] && $SETCOLOR_NORMAL 477 echo -n "]" 478 echo -ne "\r" 479 return 1 480 } 481 482 echo_warning() { 483 [ "$BOOTUP" = "color" ] && $MOVE_TO_COL 484 echo -n "[" 485 [ "$BOOTUP" = "color" ] && $SETCOLOR_WARNING 486 echo -n $"WARNING" 487 [ "$BOOTUP" = "color" ] && $SETCOLOR_NORMAL 488 echo -n "]" 489 echo -ne "\r" 490 return 1 491 } 492 493 # Inform the graphical boot of our current state 494 update_boot_stage() { 495 if [ -x /bin/plymouth ]; then 496 /bin/plymouth --update="$1" 497 fi 498 return 0 499 } 500 501 # Log that something succeeded 502 success() { 503 [ "$BOOTUP" != "verbose" -a -z "${LSB:-}" ] && echo_success 504 return 0 505 } 506 507 # Log that something failed 508 failure() { 509 local rc=$? 510 [ "$BOOTUP" != "verbose" -a -z "${LSB:-}" ] && echo_failure 511 [ -x /bin/plymouth ] && /bin/plymouth --details 512 return $rc 513 } 514 515 # Log that something passed, but may have had errors. Useful for fsck 516 passed() { 517 local rc=$? 518 [ "$BOOTUP" != "verbose" -a -z "${LSB:-}" ] && echo_passed 519 return $rc 520 } 521 522 # Log a warning 523 warning() { 524 local rc=$? 525 [ "$BOOTUP" != "verbose" -a -z "${LSB:-}" ] && echo_warning 526 return $rc 527 } 528 529 # Run some action. Log its output. 530 action() { 531 local STRING rc 532 533 STRING=$1 534 echo -n "$STRING " 535 shift 536 "$@" && success $"$STRING" || failure $"$STRING" 537 rc=$? 538 echo 539 return $rc 540 } 541 542 # returns OK if $1 contains $2 543 strstr() { 544 [ "${1#*$2*}" = "$1" ] && return 1 545 return 0 546 } 547 548 # Confirm whether we really want to run this service 549 confirm() { 550 [ -x /bin/plymouth ] && /bin/plymouth --hide-splash 551 while : ; do 552 echo -n $"Start service $1 (Y)es/(N)o/(C)ontinue? [Y] " 553 read answer 554 if strstr $"yY" "$answer" || [ "$answer" = "" ] ; then 555 return 0 556 elif strstr $"cC" "$answer" ; then 557 rm -f /var/run/confirm 558 [ -x /bin/plymouth ] && /bin/plymouth --show-splash 559 return 2 560 elif strstr $"nN" "$answer" ; then 561 return 1 562 fi 563 done 564 } 565 566 # resolve a device node to its major:minor numbers in decimal or hex 567 get_numeric_dev() { 568 ( 569 fmt="%d:%d" 570 if [ "$1" == "hex" ]; then 571 fmt="%x:%x" 572 fi 573 ls -lH "$2" | awk '{ sub(/,/, "", $5); printf("'"$fmt"'", $5, $6); }' 574 ) 2>/dev/null 575 } 576 577 # Check whether file $1 is a backup or rpm-generated file and should be ignored 578 is_ignored_file() { 579 case "$1" in 580 *~ | *.bak | *.orig | *.rpmnew | *.rpmorig | *.rpmsave) 581 return 0 582 ;; 583 esac 584 return 1 585 } 586 587 # Evaluate shvar-style booleans 588 is_true() { 589 case "$1" in 590 [tT] | [yY] | [yY][eE][sS] | [tT][rR][uU][eE]) 591 return 0 592 ;; 593 esac 594 return 1 595 } 596 597 # Evaluate shvar-style booleans 598 is_false() { 599 case "$1" in 600 [fF] | [nN] | [nN][oO] | [fF][aA][lL][sS][eE]) 601 return 0 602 ;; 603 esac 604 return 1 605 } 606 607 # Apply sysctl settings, including files in /etc/sysctl.d 608 apply_sysctl() { 609 sysctl -e -p /etc/sysctl.conf >/dev/null 2>&1 610 for file in /etc/sysctl.d/* ; do 611 is_ignored_file "$file" && continue 612 test -f "$file" && sysctl -e -p "$file" >/dev/null 2>&1 613 done 614 } 615 616 key_is_random() { 617 [ "$1" = "/dev/urandom" -o "$1" = "/dev/hw_random" \ 618 -o "$1" = "/dev/random" ] 619 } 620 621 find_crypto_mount_point() { 622 local fs_spec fs_file fs_vfstype remaining_fields 623 local fs 624 while read fs_spec fs_file remaining_fields; do 625 if [ "$fs_spec" = "/dev/mapper/$1" ]; then 626 echo $fs_file 627 break; 628 fi 629 done < /etc/fstab 630 } 631 632 # Because of a chicken/egg problem, init_crypto must be run twice. /var may be 633 # encrypted but /var/lib/random-seed is needed to initialize swap. 634 init_crypto() { 635 local have_random dst src key opt mode owner params makeswap skip arg opt 636 local param value rc ret mke2fs mdir prompt mount_point 637 638 ret=0 639 have_random=$1 640 while read dst src key opt; do 641 [ -z "$dst" -o "${dst#\#}" != "$dst" ] && continue 642 [ -b "/dev/mapper/$dst" ] && continue; 643 if [ "$have_random" = 0 ] && key_is_random "$key"; then 644 continue 645 fi 646 if [ -n "$key" -a "x$key" != "xnone" ]; then 647 if test -e "$key" ; then 648 owner=$(ls -l $key | (read a b owner rest; echo $owner)) 649 if ! key_is_random "$key"; then 650 mode=$(ls -l "$key" | cut -c 5-10) 651 if [ "$mode" != "------" ]; then 652 echo $"INSECURE MODE FOR $key" 653 fi 654 fi 655 if [ "$owner" != root ]; then 656 echo $"INSECURE OWNER FOR $key" 657 fi 658 else 659 echo $"Key file for $dst not found, skipping" 660 ret=1 661 continue 662 fi 663 else 664 key="" 665 fi 666 params="" 667 makeswap="" 668 mke2fs="" 669 skip="" 670 # Parse the src field for UUID= and convert to real device names 671 if [ "${src%%=*}" == "UUID" ]; then 672 src=$(/sbin/blkid -t "$src" -l -o device) 673 elif [ "${src/^\/dev\/disk\/by-uuid\/}" != "$src" ]; then 674 src=$(__readlink $src) 675 fi 676 # Is it a block device? 677 [ -b "$src" ] || continue 678 # Is it already a device mapper slave? (this is gross) 679 devesc=${src##/dev/} 680 devesc=${devesc//\//!} 681 for d in /sys/block/dm-*/slaves ; do 682 [ -e $d/$devesc ] && continue 2 683 done 684 # Parse the options field, convert to cryptsetup parameters and 685 # contruct the command line 686 while [ -n "$opt" ]; do 687 arg=${opt%%,*} 688 opt=${opt##$arg} 689 opt=${opt##,} 690 param=${arg%%=*} 691 value=${arg##$param=} 692 693 case "$param" in 694 cipher) 695 params="$params -c $value" 696 if [ -z "$value" ]; then 697 echo $"$dst: no value for cipher option, skipping" 698 skip="yes" 699 fi 700 ;; 701 size) 702 params="$params -s $value" 703 if [ -z "$value" ]; then 704 echo $"$dst: no value for size option, skipping" 705 skip="yes" 706 fi 707 ;; 708 hash) 709 params="$params -h $value" 710 if [ -z "$value" ]; then 711 echo $"$dst: no value for hash option, skipping" 712 skip="yes" 713 fi 714 ;; 715 verify) 716 params="$params -y" 717 ;; 718 swap) 719 makeswap=yes 720 ;; 721 tmp) 722 mke2fs=yes 723 esac 724 done 725 if [ "$skip" = "yes" ]; then 726 ret=1 727 continue 728 fi 729 if [ -z "$makeswap" ] && cryptsetup isLuks "$src" 2>/dev/null ; then 730 if key_is_random "$key"; then 731 echo $"$dst: LUKS requires non-random key, skipping" 732 ret=1 733 continue 734 fi 735 if [ -n "$params" ]; then 736 echo "$dst: options are invalid for LUKS partitions," \ 737 "ignoring them" 738 fi 739 if [ -n "$key" ]; then 740 /sbin/cryptsetup -d $key luksOpen "$src" "$dst" <&1 2>/dev/null && success || failure 741 rc=$? 742 else 743 mount_point="$(find_crypto_mount_point $dst)" 744 [ -n "$mount_point" ] || mount_point=${src##*/} 745 prompt=$(printf $"%s is password protected" "$mount_point") 746 plymouth ask-for-password --prompt "$prompt" --command="/sbin/cryptsetup luksOpen -T1 $src $dst" <&1 747 rc=$? 748 fi 749 else 750 [ -z "$key" ] && plymouth --hide-splash 751 /sbin/cryptsetup $params ${key:+-d $key} create "$dst" "$src" <&1 2>/dev/null && success || failure 752 rc=$? 753 [ -z "$key" ] && plymouth --show-splash 754 fi 755 if [ $rc -ne 0 ]; then 756 ret=1 757 continue 758 fi 759 if [ -b "/dev/mapper/$dst" ]; then 760 if [ "$makeswap" = "yes" ]; then 761 mkswap "/dev/mapper/$dst" 2>/dev/null >/dev/null 762 fi 763 if [ "$mke2fs" = "yes" ]; then 764 if mke2fs "/dev/mapper/$dst" 2>/dev/null >/dev/null \ 765 && mdir=$(mktemp -d /tmp/mountXXXXXX); then 766 mount "/dev/mapper/$dst" "$mdir" && chmod 1777 "$mdir" 767 umount "$mdir" 768 rmdir "$mdir" 769 fi 770 fi 771 fi 772 done < /etc/crypttab 773 return $ret 774 } 775 776 # A sed expression to filter out the files that is_ignored_file recognizes 777 __sed_discard_ignored_files='/\(~\|\.bak\|\.orig\|\.rpmnew\|\.rpmorig\|\.rpmsave\)$/d'
1. portmap脚本
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #! /bin/sh 2 # 3 # portmap Start/Stop RPC portmapper 4 # 5 # chkconfig: 345 13 87 6 # description: The portmapper manages RPC connections, which are used by \ 7 # protocols such as NFS and NIS. The portmap server must be \ 8 # running on machines which act as servers for protocols which \ 9 # make use of the RPC mechanism. 10 # processname: portmap 11 12 13 # This is an interactive program, we need the current locale 14 [ -f /etc/profile.d/lang.sh ] && . /etc/profile.d/lang.sh 15 # We can't Japanese on normal console at boot time, so force LANG=C. 16 if [ "$LANG" = "ja" -o "$LANG" = "ja_JP.eucJP" ]; then 17 if [ "$TERM" = "linux" ] ; then 18 LANG=C 19 fi 20 fi 21 22 # Source function library. 23 . /etc/init.d/functions 24 25 # Get config. 26 if [ -f /etc/sysconfig/network ]; then 27 . /etc/sysconfig/network 28 else 29 echo $"Networking not configured - exiting" 30 ...skipping... 31 stop 32 start 33 pmap_set < /var/run/portmap.state 34 rm -f /var/run/portmap.state 35 } 36 37 # See how we were called. 38 case "$1" in 39 start) 40 start 41 ;; 42 stop) 43 stop 44 ;; 45 status) 46 status portmap 47 ;; 48 restart|reload) 49 restart 50 ;; 51 condrestart) 52 [ -f /var/lock/subsys/portmap ] && restart || : 53 ;; 54 *) 55 echo $"Usage: $0 {start|stop|status|restart|reload|condrestart}" 56 exit 1 57 esac
2. rc.sysinit
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #!/bin/bash 2 # 3 # /etc/rc.d/rc.sysinit - run once at boot time 4 # 5 # Taken in part from Miquel van Smoorenburg's bcheckrc. 6 # 7 8 HOSTNAME=$(/bin/hostname) 9 10 set -m 11 12 if [ -f /etc/sysconfig/network ]; then 13 . /etc/sysconfig/network 14 fi 15 if [ -z "$HOSTNAME" -o "$HOSTNAME" = "(none)" ]; then 16 HOSTNAME=localhost 17 fi 18 19 if [ ! -e /proc/mounts ]; then 20 mount -n -t proc /proc /proc 21 mount -n -t sysfs /sys /sys >/dev/null 2>&1 22 fi 23 if [ ! -d /proc/bus/usb ]; then 24 modprobe usbcore >/dev/null 2>&1 && mount -n -t usbfs /proc/bus/usb /proc/bus/usb 25 else 26 mount -n -t usbfs /proc/bus/usb /proc/bus/usb 27 fi 28 29 #remount /dev/shm to set attributes from fstab #669700 30 mount -n -o remount /dev/shm >/dev/null 2>&1 31 32 . /etc/init.d/functions 33 34 PLYMOUTH= 35 [ -x /bin/plymouth ] && PLYMOUTH=yes 36 37 # Check SELinux status 38 SELINUX_STATE= 39 if [ -e "/selinux/enforce" ] && [ "$(cat /proc/self/attr/current)" != "kernel" ]; then 40 if [ -r "/selinux/enforce" ] ; then 41 SELINUX_STATE=$(cat "/selinux/enforce") 42 else 43 # assume enforcing if you can't read it 44 SELINUX_STATE=1 45 fi 46 fi 47 48 if [ -n "$SELINUX_STATE" -a -x /sbin/restorecon ] && __fgrep " /dev " /proc/mounts >/dev/null 2>&1 ; then 49 /sbin/restorecon -R -F /dev 2>/dev/null 50 fi 51 52 disable_selinux() { 53 echo $"*** Warning -- SELinux is active" 54 echo $"*** Disabling security enforcement for system recovery." 55 echo $"*** Run 'setenforce 1' to reenable." 56 echo "0" > "/selinux/enforce" 57 } 58 59 relabel_selinux() { 60 # if /sbin/init is not labeled correctly this process is running in the 61 # wrong context, so a reboot will be required after relabel 62 AUTORELABEL= 63 . /etc/selinux/config 64 echo "0" > /selinux/enforce 65 [ -n "$PLYMOUTH" ] && plymouth --hide-splash 66 67 if [ "$AUTORELABEL" = "0" ]; then 68 echo 69 echo $"*** Warning -- SELinux ${SELINUXTYPE} policy relabel is required. " 70 echo $"*** /etc/selinux/config indicates you want to manually fix labeling" 71 echo $"*** problems. Dropping you to a shell; the system will reboot" 72 echo $"*** when you leave the shell." 73 start rcS-emergency 74 75 else 76 echo 77 echo $"*** Warning -- SELinux ${SELINUXTYPE} policy relabel is required." 78 echo $"*** Relabeling could take a very long time, depending on file" 79 echo $"*** system size and speed of hard drives." 80 81 /sbin/fixfiles -F restore > /dev/null 2>&1 82 fi 83 rm -f /.autorelabel 84 echo $"Unmounting file systems" 85 umount -a 86 mount -n -o remount,ro / 87 echo $"Automatic reboot in progress." 88 reboot -f 89 } 90 91 # Print a text banner. 92 echo -en $"\t\tWelcome to " 93 read -r system_release < /etc/system-release 94 if [[ "$system_release" == *"Red Hat"* ]]; then 95 [ "$BOOTUP" = "color" ] && echo -en "\\033[0;31m" 96 echo -en "Red Hat" 97 [ "$BOOTUP" = "color" ] && echo -en "\\033[0;39m" 98 PRODUCT=$(sed "s/Red Hat \(.*\) release.*/\1/" /etc/system-release) 99 echo " $PRODUCT" 100 elif [[ "$system_release" == *Fedora* ]]; then 101 [ "$BOOTUP" = "color" ] && echo -en "\\033[0;34m" 102 echo -en "Fedora" 103 [ "$BOOTUP" = "color" ] && echo -en "\\033[0;39m" 104 PRODUCT=$(sed "s/Fedora \(.*\) \?release.*/\1/" /etc/system-release) 105 echo " $PRODUCT" 106 elif [[ "$system_release" =~ "CentOS" ]]; then 107 [ "$BOOTUP" = "color" ] && echo -en "\\033[0;36m" 108 echo -en "CentOS" 109 [ "$BOOTUP" = "color" ] && echo -en "\\033[0;39m" 110 PRODUCT=$(sed "s/CentOS \(.*\) \?release.*/\1/" /etc/system-release) 111 echo " $PRODUCT" 112 else 113 PRODUCT=$(sed "s/ release.*//g" /etc/system-release) 114 echo "$PRODUCT" 115 fi 116 117 # Only read this once. 118 cmdline=$(cat /proc/cmdline) 119 120 # Initialize hardware 121 if [ -f /proc/sys/kernel/modprobe ]; then 122 if ! strstr "$cmdline" nomodules && [ -f /proc/modules ] ; then 123 sysctl -w kernel.modprobe="/sbin/modprobe" >/dev/null 2>&1 124 else 125 # We used to set this to NULL, but that causes 'failed to exec' messages" 126 sysctl -w kernel.modprobe="/bin/true" >/dev/null 2>&1 127 fi 128 fi 129 130 touch /dev/.in_sysinit >/dev/null 2>&1 131 132 # Set default affinity 133 if [ -x /bin/taskset ]; then 134 if strstr "$cmdline" default_affinity= ; then 135 for arg in $cmdline ; do 136 if [ "${arg##default_affinity=}" != "${arg}" ]; then 137 /bin/taskset -p ${arg##default_affinity=} 1 138 fi 139 done 140 fi 141 fi 142 143 nashpid=$(pidof nash 2>/dev/null) 144 [ -n "$nashpid" ] && kill $nashpid >/dev/null 2>&1 145 unset nashpid 146 /sbin/start_udev 147 148 # Load other user-defined modules 149 for file in /etc/sysconfig/modules/*.modules ; do 150 [ -x $file ] && $file 151 done 152 153 # Load modules (for backward compatibility with VARs) 154 if [ -f /etc/rc.modules ]; then 155 /etc/rc.modules 156 fi 157 158 mount -n /dev/pts >/dev/null 2>&1 159 [ -n "$SELINUX_STATE" ] && restorecon -F /dev/pts >/dev/null 2>&1 160 161 # Configure kernel parameters 162 update_boot_stage RCkernelparam 163 apply_sysctl 164 165 # Set the hostname. 166 update_boot_stage RChostname 167 action $"Setting hostname ${HOSTNAME}: " hostname ${HOSTNAME} 168 [ -n "${NISDOMAIN}" ] && domainname ${NISDOMAIN} 169 170 # Sync waiting for storage. 171 { rmmod scsi_wait_scan ; modprobe scsi_wait_scan ; rmmod scsi_wait_scan ; } >/dev/null 2>&1 172 173 # Device mapper & related initialization 174 if ! __fgrep "device-mapper" /proc/devices >/dev/null 2>&1 ; then 175 modprobe dm-mod >/dev/null 2>&1 176 fi 177 178 if [ -f /etc/crypttab ]; then 179 init_crypto 0 180 fi 181 182 if ! strstr "$cmdline" nompath && [ -f /etc/multipath.conf -a \ 183 -x /sbin/multipath ]; then 184 modprobe dm-multipath > /dev/null 2>&1 185 /sbin/multipath -v 0 186 if [ -x /sbin/kpartx ]; then 187 /sbin/dmsetup ls --target multipath --exec "/sbin/kpartx -a -p p" >/dev/null 188 fi 189 fi 190 191 if ! strstr "$cmdline" nodmraid && [ -x /sbin/dmraid ]; then 192 modprobe dm-mirror >/dev/null 2>&1 193 dmraidsets=$(LC_ALL=C /sbin/dmraid -s -c -i) 194 if [ "$?" = "0" ]; then 195 for dmname in $dmraidsets; do 196 if [[ "$dmname" == isw_* ]] && \ 197 ! strstr "$cmdline" noiswmd; then 198 continue 199 fi 200 /sbin/dmraid -ay -i --rm_partitions -p "$dmname" >/dev/null 2>&1 201 /sbin/kpartx -a -p p "/dev/mapper/$dmname" 202 done 203 fi 204 fi 205 206 # Start any MD RAID arrays that haven't been started yet 207 [ -r /proc/mdstat -a -r /dev/md/md-device-map ] && /sbin/mdadm -IRs 208 209 if [ -x /sbin/lvm ]; then 210 action $"Setting up Logical Volume Management:" /sbin/lvm vgchange -a ay --sysinit 211 fi 212 213 if [ -f /etc/crypttab ]; then 214 init_crypto 0 215 fi 216 217 if [ -f /fastboot ] || strstr "$cmdline" fastboot ; then 218 fastboot=yes 219 fi 220 221 if [ -f /fsckoptions ]; then 222 fsckoptions=$(cat /fsckoptions) 223 fi 224 225 if [ -f /forcefsck ] || strstr "$cmdline" forcefsck ; then 226 fsckoptions="-f $fsckoptions" 227 elif [ -f /.autofsck ]; then 228 [ -f /etc/sysconfig/autofsck ] && . /etc/sysconfig/autofsck 229 if [ "$AUTOFSCK_DEF_CHECK" = "yes" ]; then 230 AUTOFSCK_OPT="$AUTOFSCK_OPT -f" 231 fi 232 if [ -n "$AUTOFSCK_SINGLEUSER" ]; then 233 [ -n "$PLYMOUTH" ] && plymouth --hide-splash 234 echo 235 echo $"*** Warning -- the system did not shut down cleanly. " 236 echo $"*** Dropping you to a shell; the system will continue" 237 echo $"*** when you leave the shell." 238 [ -n "$SELINUX_STATE" ] && echo "0" > /selinux/enforce 239 start rcS-emergency 240 [ -n "$SELINUX_STATE" ] && echo "1" > /selinux/enforce 241 [ -n "$PLYMOUTH" ] && plymouth --show-splash 242 fi 243 fsckoptions="$AUTOFSCK_OPT $fsckoptions" 244 fi 245 246 if [ "$BOOTUP" = "color" ]; then 247 fsckoptions="-C $fsckoptions" 248 else 249 fsckoptions="-V $fsckoptions" 250 fi 251 252 READONLY= 253 if [ -f /etc/sysconfig/readonly-root ]; then 254 . /etc/sysconfig/readonly-root 255 fi 256 if strstr "$cmdline" readonlyroot ; then 257 READONLY=yes 258 [ -z "$RW_MOUNT" ] && RW_MOUNT=/var/lib/stateless/writable 259 [ -z "$STATE_MOUNT" ] && STATE_MOUNT=/var/lib/stateless/state 260 fi 261 if strstr "$cmdline" noreadonlyroot ; then 262 READONLY=no 263 fi 264 265 if [ "$READONLY" = "yes" -o "$TEMPORARY_STATE" = "yes" ]; then 266 267 mount_empty() { 268 if [ -e "$1" ]; then 269 echo "$1" | cpio -p -vd "$RW_MOUNT" &>/dev/null 270 mount -n --bind "$RW_MOUNT$1" "$1" 271 fi 272 } 273 274 mount_dirs() { 275 if [ -e "$1" ]; then 276 mkdir -p "$RW_MOUNT$1" 277 find "$1" -type d -print0 | cpio -p -0vd "$RW_MOUNT" &>/dev/null 278 mount -n --bind "$RW_MOUNT$1" "$1" 279 fi 280 } 281 282 mount_files() { 283 if [ -e "$1" ]; then 284 cp -a --parents "$1" "$RW_MOUNT" 285 mount -n --bind "$RW_MOUNT$1" "$1" 286 fi 287 } 288 289 # Common mount options for scratch space regardless of 290 # type of backing store 291 mountopts= 292 293 # Scan partitions for local scratch storage 294 rw_mount_dev=$(blkid -t LABEL="$RW_LABEL" -l -o device) 295 296 # First try to mount scratch storage from /etc/fstab, then any 297 # partition with the proper label. If either succeeds, be sure 298 # to wipe the scratch storage clean. If both fail, then mount 299 # scratch storage via tmpfs. 300 if mount $mountopts "$RW_MOUNT" > /dev/null 2>&1 ; then 301 rm -rf "$RW_MOUNT" > /dev/null 2>&1 302 elif [ x$rw_mount_dev != x ] && mount $rw_mount_dev $mountopts "$RW_MOUNT" > /dev/null 2>&1; then 303 rm -rf "$RW_MOUNT" > /dev/null 2>&1 304 else 305 mount -n -t tmpfs $RW_OPTIONS $mountopts none "$RW_MOUNT" 306 fi 307 308 for file in /etc/rwtab /etc/rwtab.d/* /dev/.initramfs/rwtab ; do 309 is_ignored_file "$file" && continue 310 [ -f $file ] && cat $file | while read type path ; do 311 case "$type" in 312 empty) 313 mount_empty $path 314 ;; 315 files) 316 mount_files $path 317 ;; 318 dirs) 319 mount_dirs $path 320 ;; 321 *) 322 ;; 323 esac 324 [ -n "$SELINUX_STATE" -a -e "$path" ] && restorecon -R "$path" 325 done 326 done 327 328 # Use any state passed by initramfs 329 [ -d /dev/.initramfs/state ] && cp -a /dev/.initramfs/state/* $RW_MOUNT 330 331 # In theory there should be no more than one network interface active 332 # this early in the boot process -- the one we're booting from. 333 # Use the network address to set the hostname of the client. This 334 # must be done even if we have local storage. 335 ipaddr= 336 if [ "$HOSTNAME" = "localhost" -o "$HOSTNAME" = "localhost.localdomain" ]; then 337 ipaddr=$(ip addr show to 0.0.0.0/0 scope global | awk '/[[:space:]]inet / { print gensub("/.*","","g",$2) }') 338 for ip in $ipaddr ; do 339 HOSTNAME= 340 eval $(ipcalc -h $ip 2>/dev/null) 341 [ -n "$HOSTNAME" ] && { hostname ${HOSTNAME} ; break; } 342 done 343 fi 344 345 # Clients with read-only root filesystems may be provided with a 346 # place where they can place minimal amounts of persistent 347 # state. SSH keys or puppet certificates for example. 348 # 349 # Ideally we'll use puppet to manage the state directory and to 350 # create the bind mounts. However, until that's all ready this 351 # is sufficient to build a working system. 352 353 # First try to mount persistent data from /etc/fstab, then any 354 # partition with the proper label, then fallback to NFS 355 state_mount_dev=$(blkid -t LABEL="$STATE_LABEL" -l -o device) 356 if mount $mountopts $STATE_OPTIONS "$STATE_MOUNT" > /dev/null 2>&1 ; then 357 /bin/true 358 elif [ x$state_mount_dev != x ] && mount $state_mount_dev $mountopts "$STATE_MOUNT" > /dev/null 2>&1; then 359 /bin/true 360 elif [ ! -z "$CLIENTSTATE" ]; then 361 # No local storage was found. Make a final attempt to find 362 # state on an NFS server. 363 364 mount -t nfs $CLIENTSTATE/$HOSTNAME $STATE_MOUNT -o rw,nolock 365 fi 366 367 if [ -w "$STATE_MOUNT" ]; then 368 369 mount_state() { 370 if [ -e "$1" ]; then 371 [ ! -e "$STATE_MOUNT$1" ] && cp -a --parents "$1" "$STATE_MOUNT" 372 mount -n --bind "$STATE_MOUNT$1" "$1" 373 fi 374 } 375 376 for file in /etc/statetab /etc/statetab.d/* ; do 377 is_ignored_file "$file" && continue 378 [ ! -f "$file" ] && continue 379 380 if [ -f "$STATE_MOUNT/$file" ] ; then 381 mount -n --bind "$STATE_MOUNT/$file" "$file" 382 fi 383 384 for path in $(grep -v "^#" "$file" 2>/dev/null); do 385 mount_state "$path" 386 [ -n "$SELINUX_STATE" -a -e "$path" ] && restorecon -R "$path" 387 done 388 done 389 390 if [ -f "$STATE_MOUNT/files" ] ; then 391 for path in $(grep -v "^#" "$STATE_MOUNT/files" 2>/dev/null); do 392 mount_state "$path" 393 [ -n "$SELINUX_STATE" -a -e "$path" ] && restorecon -R "$path" 394 done 395 fi 396 fi 397 fi 398 399 if [[ " $fsckoptions" != *" -y"* ]]; then 400 fsckoptions="-a $fsckoptions" 401 fi 402 403 _RUN_QUOTACHECK=0 404 if [ -f /forcequotacheck ] || strstr "$cmdline" forcequotacheck ; then 405 _RUN_QUOTACHECK=1 406 fi 407 if [ -z "$fastboot" -a "$READONLY" != "yes" ]; then 408 409 STRING=$"Checking filesystems" 410 echo $STRING 411 fsck -T -t noopts=_netdev -A $fsckoptions 412 rc=$? 413 414 if [ "$rc" -eq "0" ]; then 415 success "$STRING" 416 echo 417 elif [ "$rc" -eq "1" ]; then 418 passed "$STRING" 419 echo 420 elif [ "$rc" -eq "2" -o "$rc" -eq "3" ]; then 421 echo $"Unmounting file systems" 422 umount -a 423 mount -n -o remount,ro / 424 echo $"Automatic reboot in progress." 425 reboot -f 426 fi 427 428 # A return of 4 or higher means there were serious problems. 429 if [ $rc -gt 1 ]; then 430 [ -n "$PLYMOUTH" ] && plymouth --hide-splash 431 432 failure "$STRING" 433 echo 434 echo 435 echo $"*** An error occurred during the file system check." 436 echo $"*** Dropping you to a shell; the system will reboot" 437 echo $"*** when you leave the shell." 438 439 str=$"(Repair filesystem)" 440 PS1="$str \# # "; export PS1 441 [ "$SELINUX_STATE" = "1" ] && disable_selinux 442 start rcS-emergency 443 444 echo $"Unmounting file systems" 445 umount -a 446 mount -n -o remount,ro / 447 echo $"Automatic reboot in progress." 448 reboot -f 449 elif [ "$rc" -eq "1" ]; then 450 _RUN_QUOTACHECK=1 451 fi 452 fi 453 454 remount_needed() { 455 local state oldifs 456 [ "$READONLY" = "yes" ] && return 1 457 state=$(LC_ALL=C awk '/ \/ / && ($3 !~ /rootfs/) { print $4 }' /proc/mounts) 458 oldifs=$IFS 459 IFS="," 460 for opt in $state ; do 461 if [ "$opt" = "rw" ]; then 462 IFS=$oldifs 463 return 1 464 fi 465 done 466 IFS=$oldifs 467 return 0 468 } 469 470 # Remount the root filesystem read-write. 471 update_boot_stage RCmountfs 472 if remount_needed ; then 473 action $"Remounting root filesystem in read-write mode: " mount -n -o remount,rw / 474 fi 475 476 # Clean up SELinux labels 477 if [ -n "$SELINUX_STATE" ]; then 478 restorecon /etc/mtab /etc/ld.so.cache /etc/blkid/blkid.tab /etc/resolv.conf >/dev/null 2>&1 479 fi 480 481 # If relabeling, relabel mount points. 482 if [ -n "$SELINUX_STATE" -a "$READONLY" != "yes" ]; then 483 if [ -f /.autorelabel ] || strstr "$cmdline" autorelabel ; then 484 restorecon $(awk '!/^#/ && $4 !~ /noauto/ && $2 ~ /^\// { print $2 }' /etc/fstab) >/dev/null 2>&1 485 fi 486 fi 487 488 if [ "$READONLY" != "yes" ] ; then 489 # Clear mtab 490 (> /etc/mtab) &> /dev/null 491 492 # Remove stale backups 493 rm -f /etc/mtab~ /etc/mtab~~ 494 495 # Enter mounted filesystems into /etc/mtab 496 mount -f / 497 mount -f /proc >/dev/null 2>&1 498 mount -f /sys >/dev/null 2>&1 499 mount -f /dev/pts >/dev/null 2>&1 500 mount -f /dev/shm >/dev/null 2>&1 501 mount -f /proc/bus/usb >/dev/null 2>&1 502 fi 503 504 # Mount all other filesystems (except for NFS and /proc, which is already 505 # mounted). Contrary to standard usage, 506 # filesystems are NOT unmounted in single user mode. 507 # The 'no' applies to all listed filesystem types. See mount(8). 508 if [ "$READONLY" != "yes" ] ; then 509 action $"Mounting local filesystems: " mount -a -t nonfs,nfs4,smbfs,ncpfs,cifs,gfs,gfs2 -O no_netdev 510 else 511 action $"Mounting local filesystems: " mount -a -n -t nonfs,nfs4,smbfs,ncpfs,cifs,gfs,gfs2 -O no_netdev 512 fi 513 514 # Update quotas if necessary 515 if [ X"$_RUN_QUOTACHECK" = X1 -a -x /sbin/quotacheck ]; then 516 action $"Checking local filesystem quotas: " /sbin/quotacheck -anug 517 fi 518 519 if [ -x /sbin/quotaon ]; then 520 action $"Enabling local filesystem quotas: " /sbin/quotaon -aug 521 fi 522 523 # Check to see if a full relabel is needed 524 if [ -n "$SELINUX_STATE" -a "$READONLY" != "yes" ]; then 525 if [ -f /.autorelabel ] || strstr "$cmdline" autorelabel ; then 526 relabel_selinux 527 fi 528 else 529 if [ -d /etc/selinux -a "$READONLY" != "yes" ]; then 530 [ -f /.autorelabel ] || touch /.autorelabel 531 fi 532 fi 533 534 # Initialize pseudo-random number generator 535 if [ -f "/var/lib/random-seed" ]; then 536 cat /var/lib/random-seed > /dev/urandom 537 else 538 [ "$READONLY" != "yes" ] && touch /var/lib/random-seed 539 fi 540 if [ "$READONLY" != "yes" ]; then 541 chmod 600 /var/lib/random-seed 542 dd if=/dev/urandom of=/var/lib/random-seed count=1 bs=512 2>/dev/null 543 fi 544 545 if [ -f /etc/crypttab ]; then 546 init_crypto 1 547 fi 548 549 # Configure machine if necessary. 550 if [ -f /.unconfigured ]; then 551 552 if [ -x /bin/plymouth ]; then 553 /bin/plymouth quit 554 fi 555 556 if [ -x /usr/bin/system-config-keyboard ]; then 557 /usr/bin/system-config-keyboard 558 fi 559 if [ -x /usr/bin/passwd ]; then 560 /usr/bin/passwd root 561 fi 562 if [ -x /usr/sbin/system-config-network-tui ]; then 563 /usr/sbin/system-config-network-tui 564 fi 565 if [ -x /usr/sbin/timeconfig ]; then 566 /usr/sbin/timeconfig 567 fi 568 if [ -x /usr/sbin/authconfig-tui ]; then 569 /usr/sbin/authconfig-tui --nostart 570 fi 571 if [ -x /usr/sbin/ntsysv ]; then 572 /usr/sbin/ntsysv --level 35 573 fi 574 575 # Reread in network configuration data. 576 if [ -f /etc/sysconfig/network ]; then 577 . /etc/sysconfig/network 578 579 # Reset the hostname. 580 action $"Resetting hostname ${HOSTNAME}: " hostname ${HOSTNAME} 581 fi 582 583 rm -f /.unconfigured 584 fi 585 586 # Clean out /. 587 rm -f /fastboot /fsckoptions /forcefsck /.autofsck /forcequotacheck /halt \ 588 /poweroff /.suspended &> /dev/null 589 590 # Do we need (w|u)tmpx files? We don't set them up, but the sysadmin might... 591 _NEED_XFILES= 592 [ -f /var/run/utmpx -o -f /var/log/wtmpx ] && _NEED_XFILES=1 593 594 # Clean up /var. 595 rm -rf /var/lock/cvs/* /var/run/screen/* 596 find /var/lock /var/run ! -type d -exec rm -f {} \; 597 rm -f /var/lib/rpm/__db* &> /dev/null 598 rm -f /var/gdm/.gdmfifo &> /dev/null 599 600 [ "$PROMPT" != no ] && plymouth watch-keystroke --command "touch /var/run/confirm" --keys=Ii & 601 602 # Clean up utmp/wtmp 603 > /var/run/utmp 604 touch /var/log/wtmp 605 chgrp utmp /var/run/utmp /var/log/wtmp 606 chmod 0664 /var/run/utmp /var/log/wtmp 607 if [ -n "$_NEED_XFILES" ]; then 608 > /var/run/utmpx 609 touch /var/log/wtmpx 610 chgrp utmp /var/run/utmpx /var/log/wtmpx 611 chmod 0664 /var/run/utmpx /var/log/wtmpx 612 fi 613 [ -n "$SELINUX_STATE" ] && restorecon /var/run/utmp* /var/log/wtmp* >/dev/null 2>&1 614 615 # Clean up various /tmp bits 616 [ -n "$SELINUX_STATE" ] && restorecon /tmp 617 rm -f /tmp/.X*-lock /tmp/.lock.* /tmp/.gdm_socket /tmp/.s.PGSQL.* 618 rm -rf /tmp/.X*-unix /tmp/.ICE-unix /tmp/.font-unix /tmp/hsperfdata_* \ 619 /tmp/kde-* /tmp/ksocket-* /tmp/mc-* /tmp/mcop-* /tmp/orbit-* \ 620 /tmp/scrollkeeper-* /tmp/ssh-* \ 621 /dev/.in_sysinit 622 623 # Make ICE directory 624 mkdir -m 1777 -p /tmp/.ICE-unix >/dev/null 2>&1 625 chown root:root /tmp/.ICE-unix 626 [ -n "$SELINUX_STATE" ] && restorecon /tmp/.ICE-unix >/dev/null 2>&1 627 628 # Start up swapping. 629 update_boot_stage RCswap 630 action $"Enabling /etc/fstab swaps: " swapon -a -e 631 if [ "$AUTOSWAP" = "yes" ]; then 632 curswap=$(awk '/^\/dev/ { print $1 }' /proc/swaps | while read x; do get_numeric_dev dec $x ; echo -n " "; done) 633 swappartitions=$(blkid -t TYPE=swap -o device) 634 if [ x"$swappartitions" != x ]; then 635 for partition in $swappartitions ; do 636 [ ! -e $partition ] && continue 637 majmin=$(get_numeric_dev dec $partition) 638 echo $curswap | grep -qw "$majmin" || action $"Enabling local swap partitions: " swapon $partition 639 done 640 fi 641 fi 642 643 # Set up binfmt_misc 644 /bin/mount -t binfmt_misc none /proc/sys/fs/binfmt_misc > /dev/null 2>&1 645 646 # Boot time profiles. Yes, this should be somewhere else. 647 if [ -x /usr/sbin/system-config-network-cmd ]; then 648 if strstr "$cmdline" netprofile= ; then 649 for arg in $cmdline ; do 650 if [ "${arg##netprofile=}" != "${arg}" ]; then 651 /usr/sbin/system-config-network-cmd --profile ${arg##netprofile=} 652 fi 653 done 654 fi 655 fi 656 657 # Now that we have all of our basic modules loaded and the kernel going, 658 # let's dump the syslog ring somewhere so we can find it later 659 [ -f /var/log/dmesg ] && mv -f /var/log/dmesg /var/log/dmesg.old 660 dmesg -s 131072 > /var/log/dmesg 661 662 # create the crash indicator flag to warn on crashes, offer fsck with timeout 663 touch /.autofsck &> /dev/null 664 665 [ "$PROMPT" != no ] && plymouth --ignore-keystroke=Ii 666 if strstr "$cmdline" confirm ; then 667 touch /var/run/confirm 668 fi 669 670 # Let rhgb know that we're leaving rc.sysinit 671 if [ -x /bin/plymouth ]; then 672 /bin/plymouth --sysinit 673 fi
FLT的DEMO
0. 一键式[未完成版本]
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #set env 2 export PATH=$PATH:/bin:/sbin:/usr/sbin 3 export LANG='us' 4 5 #Root allowed 6 if [ `whoami` != 'root' ];then 7 echo "Please run this script with root " 8 exit 1 9 fi 10 11 #define cmd var 12 SERVICE=`which service` 13 CHKCONFIG= `which chkconfig` 14 15 #import libiary 16 . /etc/init.d/functions 17 18 #Config Yum Config 19 function yum(){ 20 echo "Config Yum Centos-Base.repo" 21 cd /etc/yum.repos.d/ 22 cp rhel-source.repo rhel-source.repo.$(date +%F) 23 ping www.baidu.com 24 [ $? -eq 0 ] && echo $"Networking not configured" && exit 1 25 wget --quiet http://mirrors.163.com/.help/CentOS6-Base-163.repo 26 sed -i 's/$releasever/6/g' CentOS6-Base-163.repo 27 chmod 644 CentOS6-Base-163.repo 28 chown root.root CentOS6-Base-163.repo 29 } 30 31 #Install Init Package 32 function installTool(){ 33 echo "sysstat ntp net-snmp lrzsz rsync" 34 yum install sysstat ntp net-snmp lrzsz rsync 2>&/dev/null 35 } 36 37 #Chinese GB18030 38 function initI18n(){ 39 echo "#set LANG="zh_cn.gb18030"" 40 cp /etc/sysconfig/i18n /etc/sysconfig/i18n_`date +%F` 41 sed -i 's/LANG="en_US.UTF-8"/LANG="zh_CN.GB18030"/g' /etc/sysconfig/i18n 42 grep LANG /etc/sysconfig/i18n 43 sleep 1 44 } 45 46 #close selinux and iptables 47 initFirewall(){ 48 echo "#close selinux and firewall" 49 cp /etc/selinux/config /etc/selinux/config_`date +%F` 50 /etc/init.d/iptables stop 51 sed -i 's/SELINUX=enable/SELINUX=disable/g' /etc/selinux/config 52 setenforce 0 53 /etc/init.d/iptables status 54 grep SELINUX=disable /etc/selinux/config 55 echo "Close selinux Ok " 56 echo "Close firewall Ok " 57 sleep 1 58 } 59 60 #Init Auto Startup Service 61 function initService(){ 62 echo "Close Nonuseful service..." 63 exprt LANG=us 64 chkconfig |grep 3:on | awk '{print $1}' | grep -Ev "sshd|network|crond|sysstat|rsyslog" | xargs -I{} chkconfig {} off 65 echo "Service sshd|network|crond|sysstat|rsyslog is Running...." 66 sleep 1 67 } 68 69 #Init ssh 70 function ssh(){ 71 echo "config sshConfig ...." 72 cp /etc/ssh/sshd_config /etc/ssh/sshd_config_`date +%F` 73 sed -i 's#GSSAPIAuthentication yes#GSSAPIAuthentication no#g' /etc/ssh/sshd_config 74 sed -i 's#PermitRootLogin no#PermitRootLogin no#g' /etc/ssh/sshd_config 75 sed -i 's%#Port 22%Port 11544%g' /etc/ssh/sshd_config 76 } 77 78 #AddUser 79 function addUser(){ 80 echo "add User for Linux System..." 81 cp /etc/sudoers /etc/sudoers_`date +%F` 82 saUserArr={omc webserver webserverpt} 83 groupadd -g 888 sa 84 for((i=0;i<${#saUserArr[@]};i++)) 85 do 86 useradd -g sa -u88${i} ${saUserArr[$i]} 87 echo "${saUserArr[$i]}123"|passwd ${saUserArr[$i]} --stdin 88 # add sudoers 89 # ... 90 # /usr/sbin/visudo -c 91 # [ $? -ne 0 ] && /bin/cp /etc/sudoers.`date +%F` /etc/sudoers && echo $"Sudoers not configured --exit" && exit 1 92 # action $"useradd is ok " /bin/true 93 done 94 } 95 96 #Sync Time 97 function sysncTime(){ 98 if [ `grep pool.ntp.ort /var/spool/cron/root|grep -v grep |wc -l` -lt 1 ];then 99 echo "*/5 * * * * /usr/sbin/ntpdate cn.pool.ntp.org 2&>/dev/null" >> /var/spool/cron/root 100 fi 101 } 102 103 #adjuct File 104 function openFile(){ 105 echo "adjust the max opened files are 65535" 106 cp /etc/security/limits.conf /etc/security/limits.conf_`date +%F` 107 echo ' * - nofile 65535' >> /etc/security/limits.conf 108 ulimit -SHn 65535 109 echo "adjust the max opened files are 65535 is ok " 110 sleep 1 111 } 112 113 #adjust kernal 114 function optimizationKernal(){ 115 echo "optimizationKernal..." 116 cp /etc/sysctl.conf /etc/sysctl.conf_`date +%F` 117 cat >> /etc/sysctl.conf<<EOF 118 net.ipv4.tcp_timestamps=0 119 EOF 120 /sbin/sysctl -p && action "optimizationKernal is ok " /bin/true || actio "optimizationKernal is wrong" /bin/false 121 122 } 123 124 function safe(){ 125 echo "" 126 }
1. 清除日志
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #!/bin/sh 2 #clear log file 3 LOG_DIR=/var/log 4 ROOT_UID=0 5 #ROOT用户执行 6 if [ "$UID" -ne ROOT_UID ] 7 then 8 echo 'Must be root to run this script' 9 exit 1 10 fi 11 cd $LOG_DIR ||{ 12 echo "Cannot change to $LOG_DIR " >/dev/null 13 exit 1 14 } 15 cat /dev/null > messages 16 echo "Logs cleaned up" 17 exit 0
2. 利用shell数组函数检查多个url地址的案例
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#!/bin/sh #use array by 20170911 #use function . /etc/init.d/functions array=( www.baidu.com www.hao123.com www.51cto.com ) function wait(){ echo -n "3mins to start the script..." for((i=0;i<${#array[*]};i++)) do echo -n '.'; sleep 1 done } function check_url(){ for ((i=0;i<${#array[*]};i++)) do judge=(`curl -I ${array[$i]} -s |head -1`) #echo "${array[$i]} ------------> ${judge[2]}" if [ "${judge[1]}"=="200" ] && [ "${judge[2]}"=="OK" ];then action "${array[$i]} ------------> ${judge[2]}" /bin/true else action "${array[$i]} ------------> ${judge[2]}" /bin/false fi done } wait echo -e "\n" check_url
3. 数组的学习
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #!/bin/sh 2 #use array by 20170911 3 array=( 4 hello 5 world 6 2017 7 I 8 hava 9 a 10 dream) 11 arr=(`ls /home/omc/*.sh`) 12 echo "---------------Array---------------------" 13 for ((i=0;i<=${#array[*]};i++)) 14 do 15 echo "this is $i-------------------->${array[$i]}" 16 done 17 echo "------------------------------------" 18 echo "total : ${#array[*]}" 19 echo "---------------Ls *.sh--------------------" 20 for((i=0;i<${#arr[*]};i++)) 21 do 22 echo "this is $i -------------------> ${arr[$i]}" 23 done 24 echo "------------------------------------" 25 echo "total : ${#arr[*]}"
4. 监控WEB的URL
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 [root@lnmp01 scripts]# cat check_web.sh 2 #!/bin/sh 3 ######################################################## 4 RETVAL=0 5 SCRIPT_PATH="/root/scripts" 6 MAIL_GROUP="623799533@qq.com 623799531@qq.com" 7 LOG_FILE="/tmp/web_check.log" 8 FAIL_COUNT=0 9 function getUrlState(){ 10 for (( i = 0; i < 10; i++ )); do 11 wget -T 10 --tries=1 --spider http://${URL} &>/dev/null 12 [ $? -ne 0 ] && let ${FAIL_COUNT}+=1 13 done 14 15 if [ ${FAIL_COUNT} -gt 1 ];then 16 RETVAL=1 17 NowTime=`date +%m-%d %H:%M:%S` 18 TITLE="http://${URL} sevice is error,${NowTime}" 19 echo "send to :${MAIL_USER},Title :${TITLE}" >>${LOG_FILE} 20 for MAIL_USER in `$MAIL_GROUP` 21 do 22 mail -s ${TITLE} ${MAIL_USER} <${LOG_FILE} 23 done 24 else 25 RETVAL=0 26 fi 27 return "$RETVAL" 28 } 29 30 [ ! -d "$SCRIPT_PATH" ] && { 31 mkdir -p "$SCRIPT_PATH" 32 } 33 34 35 [ ! -f "$SCRIPT_PATH/domain.list" ] && { 36 cat > "$SCRIPT_PATH/domain.list" << EOF 37 www.baidu.com 38 www.51cto.com 39 www.http:www.hao123.com 40 EOF 41 } 42 43 for URL in `cat $SCRIPT_PATH/domain.list` 44 do 45 echo -n "checking $URL..." 46 getUrlState $URL && echo OK || echo no 47 done 48 [root@lnmp01 scripts]#
5. for循环的使用
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 方案一:计算某个access_log文件的访问总次数: 2 #!/bin/sh 3 num=`awk '{print $8}' $1 |grep -v eth0|awk -F '.' '{print $4}'` 4 sum=0 5 for line in $num 6 do 7 [ -n $line ] || continue 8 ((sum+=$line)) 9 done 10 echo "Num is $sum" 11 12 13 问题二:打印文件夹 14 ls -F|grep / 15 16 问题三:打印文件夹 17 #!/bin/sh 18 openvpn="" 19 openvpn_locations="/usr/bin/openvpn /usr/local/sbin/openvpn" 20 for location in $openvpn_locations 21 do 22 [ -f $location ] && openvpn=$location 23 done 24 25 26 问题四:打印9*9 27 28 #!/bin/sh 29 for a in `seq 1 9` 30 do 31 for b in `seq 1 9 ` 32 do 33 if [ $a -ge $b ];then 34 echo -en "$a * $b = $(expr $a \* $b)" 35 fi 36 done 37 echo " " 38 done 39 40 问题5:编写连续IP的添加 41 #!/bin/sh 42 43 print_usage(){ 44 echo "USAGE: $0 {up/down}" 45 exit 1 46 } 47 48 [ $# -ne 1 ] && print_usage 49 50 ip_conf(){ 51 for((i=1;i<=16;i++)) 52 do 53 if [ $i -ne 10 ];then 54 ifconfig eth0:$i 192.168.25.$i netmask 255.255.255.0 $1 55 else 56 continue 57 fi 58 done 59 } 60 61 case $1 in 62 up) 63 ip_conf;; 64 down) 65 ip_conf;; 66 *) 67 echo "something wrong..." 68 esac
6. while循环的使用
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 ------------------------------------------------------------------------------------------ 2 方案一: 3 #!/bin/sh 4 #cal 1 + 2 + 3 +...+100 5 i=10 6 while ((i>0)) 7 do 8 echo $i 9 ((i--)) 10 done 11 ------------------------------------------------------------------------------------------ 12 方案二: 13 #!/bin/sh 14 #cal 1 + 2 + 3 +...+100 15 i=10 16 while [[ $i > 0]] 17 do 18 echo $i 19 ((i--)) 20 done 21 22 ------------------------------------------------------------------------------------------ 23 方案三: 24 #!/bin/sh 25 #cal 1 + 2 + 3 +...+100 26 i=10 27 while ((i--)) 28 do 29 echo $i 30 done 31 32 33 ------------------------------------------------------------------------------------------ 34 方案四: 35 #!/bin/sh 36 #cal 1 + 2 + 3 +...+100 37 i=10 38 while [ $i -gt 0] 39 do 40 echo $i 41 ((i--)) 42 done
7. 计算1+2+3+...+100
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 方案1:for循环结构及(())计算式shell脚本 2 #!/bin/sh 3 #cal 1 + 2 + 3 +...+100 4 j=0 5 for ((i=0;i<=100;i++)) 6 do 7 ((j+=i)) 8 done 9 10 echo "1 + 2 + 3 +...+100="$j 11 12 --------------------------------------------------------------------------------------- 13 方案二:使用seq命令加for循环语法及let命令计算式脚本 14 #!/bin/sh 15 #cal 1 + 2 + 3 +...+100 16 sum=0 17 for i in `seq 100` 18 do 19 let sum+=i; 20 done 21 echo "1 + 2 + 3 +...+100="$sum 22 23 --------------------------------------------------------------------------------------- 24 方案三:seq、tr、sed、bc联手完成计算的方法 25 seq 100 | tr '\n' '+'|sed 's#\+$#\n#g'|bc ==>拼接的字符串表达式结尾加号替换为换行(回车)符。 26 --------------------------------------------------------------------------------------- 27 方案四: 28 #!/bin/sh 29 i=1 30 while ((i <=100 )) 31 do 32 ((j=j+i)) 33 ((i++)) 34 done 35 echo $j 36 37 --------------------------------------------------------------------------------------- 38 方案五: 39 seq 100 |awk '{total+=$1} END {print total}'
8. case语句联系
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 案例一: 纯case联系 2 #!/bin/sh 3 read -p "Please input the number of two:" num 4 case $num in 5 "1" ) 6 echo "the number you put is 1" ;; 7 "2") 8 echo "the number you put is 2";; 9 [3-9]) 10 echo "the number you put is $num";; 11 *) 12 echo "something must be wrong ..."; 13 esac 14 15 16 案例二:case-if联系 17 #!/bin/sh 18 read -p "Please input the number of two:" num 19 if [ $num -eq 1 ];then 20 echo "1" 21 elif [ $num -eq 2 ];then 22 echo "2" 23 elif [ $num -eq 3 ];then 24 echo "3" 25 else 26 echo "$num" 27 fi 28 29 案例三: 30 #/bin/sh 31 read -p "Please input the number of two:" fruit 32 case "$fruit" in 33 apple|APPLE) 34 echo -e "Apple";;
8.1 if语句
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #!/bin/sh 2 #Author: ftl 3 #Date: 20170908 4 5 print_usage(){ 6 printf "please input 2 numbers:\n" 7 echo -e "$0 num1 num2" 8 exit 1 9 } 10 11 #judge num 12 if [ $# -ne 2 ] 13 then 14 print_usage 15 fi 16 17 18 #judge num 19 [ -n "`echo $1|sed 's/[0-9]//g' `" -a -n "`echo $2|sed 's/[0-9]//g'`" ] &&\ 20 { 21 echo "$1 $2 must be number" ; 22 exit 1 23 } 24 25 #judge body 26 if [ $1 -gt $2 ] 27 then 28 echo "$1 > $2" 29 elif [ $1 -eq $2 ] 30 then 31 echo "$1 = $2" 32 else 33 echo "$1 < $2" 34 fi
9. nginx测试demo
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
10. 远程端口监控
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 方案一: 2 nmap 检查 3 4 #!/bin/sh 5 6 httpPortNum=`nmap 192.168.25.138 -p 80|grep open|wc -l` 7 if [ $httpPortNum -eq 1 ]; then 8 echo "httpd is running..." 9 else 10 echo "httpd is not running..." 11 server httpd start 12 fi 13 14 15 方案二: 16 wget -T 10 -q --spider http://192.168.25.138 &>/dev/null 17 echo $? 18 19 20 方案三: 21 curl -I -s www.baidu.com |head -1|cut -d " " -f2 22 if [ 200 -eq HTTPCODE ] 23 echo $? 24 25 实际生产测试: 26 #!/bin/sh 27 HTTPCODE=`curl -I -s www.baidu.com |head -1|cut -d " " -f2` 28 [ -f /etc/init.d/functions ] && . /etc/init.d/functions || exit 1 29 if [ "$HTTPCODE" -eq "200" ];then 30 action "BaiDu/Nginx Http Server is Ok" /bin/true 31 else 32 action "BaiDu/Nginx Http Server is Error" /bin/false 33 fi 34 35 方案四: -->手动输入IP进行判断 36 #!/bin/sh 37 38 if [ $# -ne 1 ]; then 39 echo "USAGE: $0 IPADDR" 40 exit 1 41 fi 42 HTTPCODE=`curl -I -s "$1"|head -1|cut -d " " -f2` 43 [ -f /etc/init.d/functions ] && . /etc/init.d/functions || exit 1 44 if [ "$HTTPCODE" -eq "200" ];then 45 action "BaiDu/Nginx Http Server " /bin/true 46 else 47 action "BaiDu/Nginx Http Server" /bin/false 48 49 fi 50 51 方案五 -->优化nmap 52 #!/bin/sh 53 54 if [ $# -ne 2 ]; then 55 echo "USAGE: $0 IPADDR PORT" 56 exit 1 57 fi 58 HTTPCODE=`nmap $1 -p $2|sed -n '7p'|awk '{print $2}'` -->也可以统计数量是否为1 59 [ -f /etc/init.d/functions ] && . /etc/init.d/functions || exit 1 60 if [ "$HTTPCODE" == "open" ];then 61 action "$1 on $2 port server " /bin/true 62 else 63 action "$1 on $2 port server " /bin/false 64 65 fi 66 67 方案六: 68 69 echo -e "\n"|telnet www.baidu.com 80|grep Connected|wc -l -->可以执行完成第一个管道后执行换行命令 70 71 方案七: 72 nc -w www.baidu.com 80 && echo ok
11. Mysql服务监控
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 生成环境监控Mysqsl 2 方案1:过滤3306端口,查看是否启动正常 3 ps -ef|grep 3306 |grep -v grep -->不建议,因为不太准,有的vi也是有显示结果的 4 netstat -lnput|grep 3306 5 netstat -lnput|grep 3306|wc -l -->最常用的,如果为1,则表示开启,然后判读是否为1 if [ $port -eq 1 ] 6 7 方案2;Mysql端口和进程同时存在,则服务正常 8 PORT=`netstat -lnput|grep 3306|wc -l'` 9 PROCESS=`ps -ef|grep mysqld|grep -v grep|wc -l` 10 11 方案1: 12 #!/bin/sh 13 #Author: ftl 14 #Mysql Monitor 15 16 PORT=`netstat -lnput|grep 3306|awk -F '[ :]+' '{print $5}'` -->思路不是最佳 17 if [ $PORT -eq 3306 ];then -->最还用字符串判断 if [ "$PORT" == "3306" ] 18 echo "Mysql is Running ...." 19 else 20 service mysqld start 21 fi 22 23 24 方案2: 25 #!/bin/sh 26 #Author: ftl 27 #Mysql Monitor 28 29 PORT=`netstat -lnput|grep 3306|wc -l` 30 PROCESS=`ps -ef|grep mysqld|grep -v grep|wc -l` 31 #if [ $PORT -eq 1 -a $PROCESS -eq 1 ];then -->相等的 32 if [ $PORT -eq 1 ] && [ $PROCESS -eq 2 ];then 33 echo "Mysql is Running ...." 34 else 35 service mysqld start 36 fi 37 38 39 实际的解决: 40 #!/bin/sh 41 #Author: ftl 42 #Mysql Monitor 43 44 PORT=`netstat -lnput|grep 3306|wc -l` 45 PROCESS=`ps -ef|grep mysqld|grep -v grep|wc -l` 46 #if [ $PORT -eq 1 -a $PROCESS -eq 1 ];then -->相等的 47 if [ $PORT -eq 1 ] && [ $PROCESS -eq 2 ];then 48 echo "Mysql is Running ...." 49 else 50 service mysqld start 51 sleep 10 52 PORT=`netstat -lnput|grep 3306|wc -l` 53 PROCESS=`ps -ef|grep mysqld|grep -v grep|wc -l` 54 if [ $PORT -eq 1 ] && [ $PROCESS -eq 2 ];then 55 echo "Mysql is Running ...." 56 else 57 while true 58 do 59 pkill mysqld >/dev/null 2>&1 60 sleep 1 61 [ $? -ne 0 ] && break 62 done 63 fi 64 service mysqld start && echo 'mysql is running....' 65 fi 66 67 68 69 方案3:模拟web服务器,根据mysql账户进行连接,然后根据返回在状态判断mysql是否启动 70 mysql -uroot -proot -h localhost -e "select version()"; -->查看mysql版本 71 #!/bin/sh 72 #Author: ftl 73 #Mysql Monitor 74 75 MYSQL_VERSION=` mysql -uroot -proot -e "select version()" >/dev/null` 76 if [ $? -eq 0 ];then 77 echo "Mysql is Running ...." 78 else 79 service mysqld start 80 fi 81 82 83 方案4:更专业的写法 84 用变量定义路径, 85 执行的脚本前面加上x判断 [ -x $MYSQL_SHELL ] >$LOG_DIR 86 mysql -uroot -proot -h localhost -e "select version()"; -->注意-h,用于远端的监控 87 88 方案5:最佳的,利用php/java来进行监控 89 90 <?php 91 $link_id=mysql_connect('db_etiantian','bbs','root') or mysql_error(); 92 if($link_id){ 93 echo "mysql is Ok ,Congratulation"; 94 }else{ 95 echo "Sorry,you can see logs of mysql"; 96 echo mysql_error(); 97 } 98 ?> 99
12. 菜单联系
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #!/bin/sh 2 # menu list for ftl by ftl 20170906 3 4 menu(){ 5 cat <<END 6 1.[install lamp] 7 2.[install lnmp] 8 3.[install mysql] 9 4.[install nfs] 10 0.[exit] 11 END 12 } 13 menu 14 read a 15 echo "you choose $a"
13. epxr小技巧
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 1.判断扩展名: 2 3 if expr "hello.txt" : ".*\.txt" -->判断文件拓展名是否为.txt 注意空格 4 ->为真,则输出 9 显示匹配后的字符数,包括.txt 5 ->为假,则输出非 0 6 7 8 2.判断是否是整数 9 read -p "Please input" 10 expr $a + 0 &>/dev/null 11 [ $? -eq 0 ] && echo int || echo char
14. let监听服务
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #/bin/sh 2 #Function Monitor by ftl 2017-09-06 3 4 ServerMonitor(){ 5 #Monitro status 6 timeout=10 7 fails=0 8 success=0 9 while true 10 do 11 /usr/bin/wget --timeout=$timeout --tries=1 http://192.168.25.138 -q -0 /dev/null 12 if [ $? -ne 0 ] 13 then 14 let fails+=1; 15 success=0 16 else 17 fails=0 18 let success=1 19 fi 20 21 if [ $success -ge 1 ] 22 then 23 exit 0 24 fi 25 26 if [ $fails -ge 2 ] 27 then 28 Critical="TMS is Wrong ,please Checking...." 29 echo ${Critical}|mutt -s "httpd down,please contact hhh@ftl.com" 30 fi 31 done 32 33 }
15. 用source解析命令的使用
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 [root@lamp01 omc]# echo 'dir=`date +%F`'>qq.sh 2 [root@lamp01 omc]# sh qq.sh 3 [root@lamp01 omc]# echo $dir 4 5 [root@lamp01 omc]# bash qq.sh 6 [root@lamp01 omc]# echo $dir 7 8 [root@lamp01 omc]# source qq.sh 9 [root@lamp01 omc]# echo $dir 10 2017-09-05 11 [root@lamp01 omc]# 12 说明:source将原来shell里面的东西作为结果传递给当前的shell去显示
作者:小a玖拾柒
-------------------------------------------
个性签名: 所有的事情到最後都是好的,如果不好,那說明事情還沒有到最後~
本文版权归作者【小a玖拾柒】和【博客园】共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利!