[2051] | 1 | #!/bin/sh |
---|
[2050] | 2 | # |
---|
| 3 | # end_session - Sends hangup signal to all session_gate processes |
---|
| 4 | # |
---|
| 5 | # $Source: /afs/dev.mit.edu/source/repository/athena/bin/session/end_session,v $ |
---|
[2051] | 6 | # $Header: /afs/dev.mit.edu/source/repository/athena/bin/session/end_session,v 1.2 1989-08-15 16:47:25 raeburn Exp $ |
---|
[2050] | 7 | # $Author: raeburn $ |
---|
| 8 | # |
---|
| 9 | |
---|
[2051] | 10 | MAX_PASSES=10 |
---|
| 11 | pass_num=0 |
---|
| 12 | DELAY_TIME=6 |
---|
[2050] | 13 | |
---|
[2051] | 14 | trap "exit 6" 2 3 |
---|
[2050] | 15 | |
---|
[2051] | 16 | chdir / |
---|
[2050] | 17 | |
---|
[2051] | 18 | # Process the argument list. |
---|
[2050] | 19 | |
---|
[2051] | 20 | force=0 |
---|
| 21 | while [ $# != 0 ]; do |
---|
| 22 | case $1 in |
---|
| 23 | "-f" | "-force" ) |
---|
| 24 | force=1 |
---|
| 25 | ;; |
---|
| 26 | * ) |
---|
| 27 | echo "usage: $0 [-force]" |
---|
| 28 | exit 1 |
---|
| 29 | ;; |
---|
| 30 | esac |
---|
| 31 | shift |
---|
| 32 | done |
---|
[2050] | 33 | |
---|
[2051] | 34 | # Name of file containing process ID of the session_gate process. |
---|
[2050] | 35 | |
---|
[2051] | 36 | ## This is not needed, thanks to the T-shell (/bin/csh) $uid variable. |
---|
| 37 | #awkcmd='BEGIN {found=0;} ($1=="'$USER'" && found==0) {print $3; found=1;}' |
---|
| 38 | #uid=`awk -F: "$awkcmd" < /etc/passwd` |
---|
| 39 | #if [ x"$uid" = x"" ]; then |
---|
| 40 | # fmt << EOF |
---|
| 41 | #************************************************************ |
---|
| 42 | #end_session: |
---|
| 43 | #Cannot find you in this machine's password file; therefore |
---|
| 44 | #your session_gate process id file cannot be found. I suggest |
---|
| 45 | #you reboot your workstation to fix this problem. |
---|
| 46 | #************************************************************ |
---|
| 47 | #EOF |
---|
| 48 | # exit 5 |
---|
| 49 | #fi |
---|
[2050] | 50 | |
---|
[2051] | 51 | uid=`/bin/csh -fc 'echo $uid'` |
---|
| 52 | pid_file=/tmp/session_gate_pid.$uid |
---|
[2050] | 53 | |
---|
[2051] | 54 | if [ $force = 1 ]; then |
---|
[2050] | 55 | |
---|
[2051] | 56 | # If using standard startup, permit time for session_gate to start up. |
---|
[2050] | 57 | |
---|
[2051] | 58 | sleep 2 |
---|
[2050] | 59 | |
---|
| 60 | # Kill session_gate processes by brute force. |
---|
| 61 | |
---|
[2051] | 62 | pids="`/bin/ps uxc | /bin/awk '($10 == "session_gate") { print $2 }'`" |
---|
[2050] | 63 | |
---|
[2051] | 64 | if [ x"$pids" = x"" ]; then |
---|
[2050] | 65 | echo "************************************************************" |
---|
| 66 | echo "No session_gate processes are running -- you are probably" |
---|
| 67 | echo "using a customized session file. End your session by" |
---|
| 68 | echo "terminating the last process you started in your session" |
---|
| 69 | echo "file." |
---|
| 70 | echo "************************************************************" |
---|
| 71 | exit 2 |
---|
| 72 | else |
---|
[2051] | 73 | /bin/kill -HUP $pids |
---|
| 74 | fi |
---|
[2050] | 75 | |
---|
| 76 | else |
---|
| 77 | |
---|
| 78 | # Check for readability of the file containing the process ID of the |
---|
| 79 | # session_gate process. |
---|
| 80 | |
---|
[2051] | 81 | # First, loop a while, until we can read the file, or until we time out. |
---|
| 82 | while [ ! -r $pid_file ] && [ `expr $pass_num '<' $MAX_PASSES` = 1 ]; do |
---|
| 83 | sleep $DELAY_TIME |
---|
| 84 | pass_num=`expr 1 + $pass_num` |
---|
| 85 | done |
---|
| 86 | sleep 2 |
---|
| 87 | |
---|
| 88 | if [ ! -r $pid_file ]; then |
---|
[2050] | 89 | echo "************************************************************" |
---|
| 90 | echo " Your session is still running." |
---|
| 91 | echo "" |
---|
| 92 | echo "end_session failed because:" |
---|
| 93 | echo " The file $pid_file doesn't exist or is" |
---|
| 94 | echo " not readable." |
---|
| 95 | echo "" |
---|
| 96 | echo "If you are running a .xsession file other than the system" |
---|
| 97 | echo "default, and that file does not invoke the program" |
---|
| 98 | echo "'session_gate', then end_session will not work. You should" |
---|
| 99 | echo "end your session by terminating the last process you started" |
---|
| 100 | echo "in your .xsession file." |
---|
| 101 | echo "" |
---|
| 102 | echo "If you did run session_gate, then the file was somehow" |
---|
| 103 | echo "deleted. Try typing 'end_session -force' (this time only)" |
---|
| 104 | echo "to end your session." |
---|
| 105 | echo "************************************************************" |
---|
| 106 | exit 3 |
---|
[2051] | 107 | fi |
---|
[2050] | 108 | |
---|
| 109 | # Read the process ID and attempt to kill the process. |
---|
| 110 | |
---|
[2051] | 111 | pids="`/bin/cat $pid_file`" |
---|
| 112 | problem=0 |
---|
| 113 | if [ x"$pids" = x"" ]; then |
---|
| 114 | problem=1 |
---|
| 115 | fi |
---|
| 116 | for pid in $pids ; do |
---|
| 117 | case $pid in |
---|
| 118 | -* | 0 | 1 ) |
---|
| 119 | problem=1 |
---|
| 120 | ;; |
---|
| 121 | * ) |
---|
| 122 | /bin/kill -HUP $pid > /dev/null 2>&1 |
---|
| 123 | status=$? |
---|
| 124 | case $status in |
---|
| 125 | 0 | 1 ) |
---|
| 126 | # process killed or not found |
---|
| 127 | ;; |
---|
| 128 | * ) |
---|
| 129 | problem=1 |
---|
| 130 | ;; |
---|
| 131 | esac |
---|
| 132 | ;; |
---|
| 133 | esac |
---|
| 134 | done |
---|
[2050] | 135 | |
---|
[2051] | 136 | if [ $problem = 1 ]; then |
---|
[2050] | 137 | echo "************************************************************" |
---|
| 138 | echo "end_session failed because:" |
---|
[2051] | 139 | echo " The file $pid_file may have been modified." |
---|
[2050] | 140 | echo "" |
---|
| 141 | echo "Try typing 'end_session -force' (this time only) to end your" |
---|
| 142 | echo "session." |
---|
| 143 | echo "************************************************************" |
---|
| 144 | exit 4 |
---|
[2051] | 145 | fi |
---|
[2050] | 146 | |
---|
[2051] | 147 | fi |
---|
[2050] | 148 | exit 0 |
---|