Linux 下Shell的学习-优秀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文件
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脚本
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
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. 一键式[未完成版本]
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. 清除日志
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地址的案例
#!/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. 数组的学习
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
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循环的使用
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循环的使用
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
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语句联系
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语句
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
10. 远程端口监控
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服务监控
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. 菜单联系
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小技巧
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监听服务
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解析命令的使用
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去显示
Linux 下Shell的学习-优秀demo详解相关推荐
- linux系统电脑的权限设置,Linux下的文件权限设置修改详解linux操作系统 -电脑资料...
在linux中更改所属用户组是使用chgrp,更改文件拥有者, chown,更改9个属性, chmod这三种常用的问题,在linxu中这三个命令就是对文件目录权限的控制命令了,下面我来介绍它们的用法与 ...
- linux命令大全rz,Linux下rz命令使用的实例详解
摘要 腾兴网为您分享:Linux下rz命令使用的实例详解,猿辅导,学习帮,我爱我家,唯品会等软件知识,以及2034盒子,endnotex6,方塘音控,供销网,论文修改神器,小乌龟,银河谷,兼职app, ...
- linux oracle 用户创建,LINUX下Oracle数据库用户创建方法详解
本文实例分析了LINUX下Oracle数据库用户创建方法.分享给大家供大家参考,具体如下: 1)登录linux,以oracle用户登录(如果是root用户登录的,登录后用 su - oracle命令切 ...
- Linux redis安装教程,Linux 下redis5.0.0安装教程详解
Linux redis5.0.0安装,教程如下所示: 1.从官网下载,然后传到服务器,tar -zxvf解压 2.进入redis ? 3.安装:make, (1)若提示:: gcc: Command ...
- linux 更新软件命令 失败,对linux下软件(库)的更新命令详解
在ubuntu服务器下安装包的时候,经常会用到sudo apt-get install 包名 或 sudo pip install 包名,那么两者有什么区别呢? 1.区别 pip用来安装来自PyPI( ...
- linux下多线程的创建与等待详解 【转载】
linux下多线程的创建与等待详解 http://blog.chinaunix.net/uid-23842323-id-2656572.html 所有线程都有一个线程号,也就是Thread ID.其类 ...
- linux下tar命令解压缩,tar解压缩命令 Linux下的tar压缩解压缩命令详解
<tar解压缩命令 Linux下的tar压缩解压缩命令详解>由会员分享,可在线阅读,更多相关<tar解压缩命令 Linux下的tar压缩解压缩命令详解(14页珍藏版)>请在人人 ...
- linux中的文件夹压缩文件,linux将文件拷贝到目录下Linux下文件的压缩与打包详解...
在Linux中,有很多的压缩命令.利用这些压缩命令,可以方便的从网络上下载大型的文件.同时,我们知道,Linux文件的扩展名是没有特殊意义的,不过,因为Linux下存在着许多压缩命令,所以为了方便记忆 ...
- kill -9 进程号杀不死可以用下面的杀掉 Linux下强制杀死进程的方法详解
常规篇: 首先,用ps查看进程,方法如下: $ ps -ef -- smx 1822 1 0 11:38 ? 00:00:49 gnome-terminal smx 1823 1822 0 11:38 ...
最新文章
- maven的配置-2019-4-13
- Delphi 中的 Var buffer 开类型参数
- php-fpm 无法运行cli,linux-怎样让php在cli与fpm环境下运行时加载不同的扩展?
- Java常用设计模式————工厂模式
- mac vscode 背景半透明_武装Mac|常用MacBook软件分类汇总
- 后悔药来了?发出去的微信图文消息删除后不再显示
- ORK进行物体检测过程中出现的报错及解决方案
- EasyGBS对GB35114的支持
- Unity-TouchScripts中使用TUIO的记录和简单的代码分析
- 软件工程项目—个人通讯录管理系统
- vscode修改背景
- 3.3.9nbsp;艾利·高德拉特——TOC制…
- ReactNative实现ListView分组,悬浮效果
- 前端获取北京时间_分享js获取标准北京时间的代码 JS如何获取北京时间JS
- hdu4489 The King’s Ups and Downs
- Golang PDF转图片 拼接长图 压缩PDF及图片 输出JPEG
- TC358774XBG/TC358775XBG替代方案|CS5518替代TC358774XBG/TC358775XBG设计DSI转LVSD设计资料
- load()方法异步请求数据
- 医院分诊排队叫号系统源码
- 【Java学习笔记】 网络编程04 优化字符串拼接:JSON