Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 7 Feb 2007 16:18:53 +0100
From:      "Aitor San Juan" <asanjuan@bolsabilbao.es>
To:        <freebsd-questions@freebsd.org>
Subject:   Trapping signal from shell script... doesn't seem to work?
Message-ID:  <D44BEB355E6EC14C9B825F8C956E12E1E4C1@BB06.bolsabilbao.local>
In-Reply-To: <6FA4E8E8A0FAD64F9AF5A1F0FDB8C6EE1211@BB06.bolsabilbao.local>

next in thread | previous in thread | raw e-mail | index | archive | help
Hi list!

I have written a Bourne shell script. This shell script invokes a
program written in the C language.

Below is basically the shell script source code. As you can see,
the C program is not invoked in the background, but in the
foreground, so the shell script doesn't finish until the C program
has finished.

I want the shell script to trap TERM or INT signals, so when any
of these are raised, the shell script will try to send SIGTERM to
the program "myprog":

user1:/usr/home/user1$ ps -ax | grep -v grep | grep myprog
  PID  TT  STAT      TIME COMMAND
22406  p0  I+     0:00.01 /bin/sh ../cronjobs/myshell.sh
22449  p0  I+     0:00.00 /usr/home/user1/myprog -d

user1:/usr/home/user1$ kill -TERM 22406

user1:/usr/home/user1$ ps -ax | grep -v grep | grep myprog
  PID  TT  STAT      TIME COMMAND
22406  p0  S+     0:00.01 /bin/sh ../cronjobs/myshell.sh
22449  p0  I+     0:00.00 /usr/home/user1/myprog -d

I notice the change in state of the shell script process from I+
to S+, but nothing else happens. The shell script seems to remain
in execution. However as soons as I press Ctrl-C at the terminal
where I invoked the shell script, it indeed receives the Ctrl-C,
but "myprog" receives it first so when the function "trap_handler"
executes, there is no "myprog" process in memory.

My question: Can anybody tell me what happens and/or what am I
doing wrong? Why must I press Ctrl-C to force the shell script to
finally receive the TERM signal when I executed the kill command
from another session? What is this apparent delay due to?

Thanks in advance.

#------------------ SHELL SCRIPT BEGIN ------------------
#!/bin/sh
#
trap_handler() {
    echo "*** SYSTEM SIGNAL RECEIVED ***"
    echo "$1 caught. Ending..."
    pid=3D`find_myprog's_PID`
    kill -TERM $pid
    exit 1
}

trap 'trap_handler SIGINT' INT
trap 'trap_handler SIGTERM' TERM

/usr/home/user1/myprog -d
#------------------ SHELL SCRIPT END ------------------


************ LEGEZKO OHARRA / AVISO LEGAL / LEGAL ADVICE *************=20
Mezu honek isilpeko informazioa gorde dezake, edo jabea duena, edota =
legez babestuta dagoena. Zuri zuzendua ez bada, bidali duenari esan eta =
ezabatu, inori berbidali edo gorde gabe, legeak debekatzen duelako =
mezuak erabiltzea baimenik gabe.=20
-------------------------------------------------------------------------=
-
Este mensaje puede contener informaci=F3n confidencial, en propiedad o =
legalmente protegida. Si usted no es el destinatario, le rogamos lo =
comunique al remitente y proceda a borrarlo, sin reenviarlo ni =
conservarlo, ya que su uso no autorizado est=E1 prohibido legalmente.
-------------------------------------------------------------------------=
-
This message may contain confidential, proprietary or legally privileged =
information. If you are not the intended recipient of this message, =
please notify it to the sender and delete without resending or backing =
it, as it is legally prohibited.
*************************************************************************=
*



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?D44BEB355E6EC14C9B825F8C956E12E1E4C1>