Commit | Line | Data |
---|---|---|
059ec3d9 | 1 | #! /bin/sh |
0a49a7a4 | 2 | # $Cambridge: exim/src/src/exiwhat.src,v 1.5 2009/11/16 19:50:36 nm4 Exp $ |
059ec3d9 | 3 | |
0a49a7a4 | 4 | # Copyright (c) University of Cambridge, 1995 - 2007 |
059ec3d9 PH |
5 | # See the file NOTICE for conditions of use and distribution. |
6 | ||
7 | # Except when they appear in comments, the following placeholders in this | |
8 | # source are replaced when it is turned into a runnable script: | |
9 | # | |
10 | # CONFIGURE_FILE_USE_NODE | |
11 | # CONFIGURE_FILE | |
12 | # BIN_DIRECTORY | |
13 | # EXIWHAT_PS_CMD | |
14 | # EXIWHAT_PS_ARG | |
15 | # EXIWHAT_KILL_SIGNAL | |
16 | # EXIWHAT_EGREP_ARG | |
17 | # EXIWHAT_MULTIKILL_CMD | |
18 | # EXIWHAT_MULTIKILL_ARG | |
19 | ||
20 | # PROCESSED_FLAG | |
21 | ||
22 | # Shell script for seeing what the exim processes are doing. It gets rid | |
23 | # of the old process log, then sends SIGUSR1 to all exim processes to get | |
24 | # them to write their state to the log. Then it displays the contents of | |
25 | # the log. | |
26 | ||
27 | # The following lines are generated from Exim's configuration file when | |
28 | # this source is built into a script, but you can subsequently edit them | |
29 | # without rebuilding things, as long are you are careful not to overwrite | |
30 | # the script in the next Exim rebuild/install. However, it's best to | |
31 | # arrange your build-time configuration file to get the correct values. | |
32 | ||
33 | # Some operating systems have a command that finds processes that match | |
34 | # certain conditions (by default usually those running specific commands) | |
35 | # and sends them signals. If such a command is defined for your OS, the | |
36 | # following variables are set and used. | |
37 | ||
38 | multikill_cmd=EXIWHAT_MULTIKILL_CMD | |
39 | multikill_arg=EXIWHAT_MULTIKILL_ARG | |
40 | ||
41 | # In other operating systems, Exim has to use "ps" and "egrep" to find the | |
42 | # processes itself. In those cases, the next three variables are used: | |
43 | ||
44 | ps_cmd=EXIWHAT_PS_CMD | |
45 | ps_arg=EXIWHAT_PS_ARG | |
46 | egrep_arg=EXIWHAT_EGREP_ARG | |
47 | ||
48 | # In both cases, kill_arg is the argument for the (multi)kill command to send | |
49 | # SIGUSR1 (at least one OS requires a numeric value). | |
50 | ||
51 | signal=EXIWHAT_KILL_SIGNAL | |
52 | ||
53 | # See if this installation is using the esoteric "USE_NODE" feature of Exim, | |
54 | # in which it uses the host's name as a suffix for the configuration file name. | |
55 | ||
56 | if [ "CONFIGURE_FILE_USE_NODE" = "yes" ]; then | |
57 | hostsuffix=.`uname -n` | |
58 | fi | |
59 | ||
60 | # Now find the configuration file name. This has got complicated because | |
61 | # CONFIGURE_FILE may now be a list of files. The one that is used is the first | |
62 | # one that exists. Mimic the code in readconf.c by testing first for the | |
63 | # suffixed file in each case. | |
64 | ||
65 | set `awk -F: '{ for (i = 1; i <= NF; i++) print $i }' <<End | |
66 | CONFIGURE_FILE | |
67 | End | |
68 | ` | |
69 | while [ "$config" = "" -a $# -gt 0 ] ; do | |
70 | if [ -f "$1$hostsuffix" ] ; then | |
71 | config="$1$hostsuffix" | |
72 | elif [ -f "$1" ] ; then | |
73 | config="$1" | |
74 | fi | |
75 | shift | |
76 | done | |
77 | ||
447de4b0 NM |
78 | # check we have a config file |
79 | if [ "$config" = "" -o ! -f "$config" ]; then | |
80 | echo Config file not found. | |
81 | exit 1 | |
82 | fi | |
83 | ||
059ec3d9 PH |
84 | # Determine where the spool directory is. Search for an exim_path setting |
85 | # in the configure file; otherwise use the bin directory. Call that version of | |
86 | # Exim to find the spool directory. BEWARE: a tab character is needed in the | |
87 | # first command below. It has had a nasty tendency to get lost in the past. Use | |
88 | # a variable to hold a space and a tab. This is less likely to be touched. | |
89 | ||
90 | st=' ' | |
91 | exim_path=`grep "^[$st]*exim_path" $config | sed "s/.*=[$st]*//"` | |
92 | if test "$exim_path" = ""; then exim_path=BIN_DIRECTORY/exim; fi | |
93 | spool_directory=`$exim_path -C $config -bP spool_directory | sed "s/.*=[ ]*//"` | |
94 | process_log_path=`$exim_path -C $config -bP process_log_path | sed "s/.*=[ ]*//"` | |
95 | ||
96 | # The file that Exim writes when sent the SIGUSR1 signal is specified by | |
97 | # the process_log_path option. If that is not defined, Exim uses the file | |
98 | # called "exim-process.info" in the spool directory. | |
99 | ||
100 | log=$process_log_path | |
101 | if [ "$log" = "" ] ; then | |
102 | log=$spool_directory/exim-process.info | |
103 | fi | |
104 | ||
105 | # Now do the job. | |
106 | ||
107 | /bin/rm -f ${log} | |
108 | if [ -f ${log} ]; then | |
109 | echo "** Failed to remove ${log}" | |
110 | exit 1 | |
111 | fi | |
112 | ||
113 | # If there is a multikill command, use it. On some OS this command is called | |
114 | # "killall" (Linux, FreeBSD). On Solaris it is called "pkill". Note that on | |
115 | # Solaris, "killall" kills ALL processes - this is the System V version of this | |
116 | # command, and not what we want! | |
117 | ||
079cc20f | 118 | if [ "$multikill_cmd" != "" ] && type "$multikill_cmd" >/dev/null 2>&1; then |
059ec3d9 PH |
119 | $multikill_cmd $signal "$multikill_arg" |
120 | ||
121 | # No multikill command; do it the hard way | |
122 | ||
123 | else | |
124 | $ps_cmd $ps_arg | \ | |
125 | egrep "$egrep_arg" | \ | |
126 | awk "{print \"kill $signal \"\$1}" | \ | |
127 | uniq | sh | |
128 | fi | |
129 | ||
130 | sleep 1 | |
131 | ||
132 | if [ ! -s ${log} ] ; then echo "No exim process data" ; | |
b2335c0b | 133 | else sed 's/^[0-9-]* [0-9:]* \([+-][0-9]* \)*\(\[[0-9]\+\] \)\?//' ${log} | sort -n | uniq ; fi |
059ec3d9 PH |
134 | |
135 | ||
136 | # End of exiwhat |