Use the following to invoke your script, run it in the background, and still allow yourself to log out:
- [maxwell@MaxwellDBA test]$ nohup mydaemonscript 0<&- 1>/dev/null 2>&1 &
- [1] 209178
- [maxwell@MaxwellDBA test]$ nohup mydaemonscript >>/var/log/myadmin.log 2>&1 <&- &
- [2] 209179
- [1] Exit 127 nohup mydaemonscript 0>&- > /dev/null 2>&1
- [maxwell@MaxwellDBA test]$ -bash: /var/log/myadmin.log: Permission denied
-
- [2]+ Exit 1 nohup mydaemonscript >> /var/log/myadmin.log 2>&1 0>&-
- [maxwell@MaxwellDBA test]$
But what about STDIN? The cleanest way to deal with STDIN is to close the file descriptor. The bash syntax to do that is like a redirect, but with a dash for the filename (0<&- or <&-).
We use the nohup command so that the script is run without being interrupted by a hangup signal when we log off.
- [maxwell@MaxwellDBA test]$ sh -x use_prefs.sh
- + source /home/maxwell/shelllearning/test/myprefs.cfg
- ++ SCRATCH_DIR=/var/tmp
- ++ IMG_FMT=png
- ++ SND_FMT=ogg
- + cd /var/tmp
- + echo You prefer png image files
- You prefer png image files
- + echo You prefer ogg sound files
- You prefer ogg sound files
- [maxwell@MaxwellDBA test]$ cat myprefs.cfg
- SCRATCH_DIR=/var/tmp
- IMG_FMT=png
- SND_FMT=ogg
- [maxwell@MaxwellDBA test]$ cat use_prefs.sh
- #!/bin/bash
- #
- # use the user prefs
- #
- source $HOME/shelllearning/test/myprefs.cfg
- cd ${SCRATCH_DIR:-/tmp}
- echo You prefer $IMG_FMT image files
- echo You prefer $SND_FMT sound files
- [maxwell@MaxwellDBA test]$
- # define the function:
- function max ( )
- { ... }
- #
- # call the function:
- #
- max 128 $SIM
- max $VAR $CNT
- [maxwell@MaxwellDBA test]$ sh -x max 128 $SIM
- [maxwell@MaxwellDBA test]$ echo $BIGR
-
- [maxwell@MaxwellDBA test]$ cat max
- #!/bin/bash
- #cookbook filename: func_max
-
- # define the function:
- function max ()
- {
- local HIDN
- if [ $1 -gt $2 ]
- then
- BIGR=$1
- else
- BIGR=$2
- fi
- HIDN=5
- }
- [maxwell@MaxwellDBA test]$
Use the trap utility to set signal handlers. First, use trap -l (or kill -l) to list the signals you may trap. They vary from system to system:
- [maxwell@MaxwellDBA test]$ trap -l
- 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
- 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
- 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
- 16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
- 21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
- 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
- 31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
- 38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
- 43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
- 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
- 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
- 58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
- 63) SIGRTMAX-1 64) SIGRTMAX
- [maxwell@MaxwellDBA test]$
- [maxwell@MaxwellDBA test]$ cat hard_to_kill.sh
- #!/bin/bash -
- trap ' echo "You got me! $?" ' ABRT EXIT HUP INT TERM QUIT
- trap ' echo "Later... $?"; exit ' USR1
- sleep 120
- [maxwell@MaxwellDBA test]$ sh -x hard_to_kill.sh
- + trap ' echo "You got me! $?" ' ABRT EXIT HUP INT TERM QUIT
- + trap ' echo "Later... $?"; exit ' USR1
- + sleep 120
- ^C++ echo 'You got me! 130'
- You got me! 130
- + echo 'You got me! 130'
- You got me! 130
- [maxwell@MaxwellDBA test]$ sh -x hard_to_kill.sh &
- [1] 209366
- [maxwell@MaxwellDBA test]$ + trap ' echo "You got me! $?" ' ABRT EXIT HUP INT TERM QUIT
- + trap ' echo "Later... $?"; exit ' USR1
- + sleep 120
-
- [maxwell@MaxwellDBA test]$ kill -USR1 %1
- [maxwell@MaxwellDBA test]$ User defined signal 1
- ++ echo 'Later... 138'
- Later... 138
- ++ exit
- + echo 'You got me! 0'
- You got me! 0
-
- [1]+ Done sh -x hard_to_kill.sh
- [maxwell@MaxwellDBA test]$ sh -x hard_to_kill.sh &
- [1] 209374
- [maxwell@MaxwellDBA test]$ + trap ' echo "You got me! $?" ' ABRT EXIT HUP INT TERM QUIT
- + trap ' echo "Later... $?"; exit ' USR1
- + sleep 120
-
- [maxwell@MaxwellDBA test]$ kill %1
- [maxwell@MaxwellDBA test]$ Terminated
- ++ echo 'You got me! 143'
- You got me! 143
- + echo 'You got me! 143'
- You got me! 143
-
- [1]+ Exit 143 sh -x hard_to_kill.sh
- [maxwell@MaxwellDBA test]$