Signal trapped during read resumes sleeping


View Poll Results: What do you think of this method to solve the problem?
Useless technique 0 0%
At least not a total waste of time 0 0%
There are better methods 0 0%
Great kluge 0 0%
Multiple Choice Poll. Voters: 0. This poll is closed

Login or Register for Dates, Times and to Reply

 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Signal trapped during read resumes sleeping
# 1  
Blade Signal trapped during read resumes sleeping

Greetings. This is my first post in this forum; I hope y'all find it useful. One caveat: "Concise" is my middle name. NOT! Smilie

I am almost done with a shell script that runs as a daemon. It monitors a message log that is frequently written to by a database server but it it works my client will have more such daemons.

After a few rough starts and things that just don't work, I am using dtksh (M-12/28/93d; the alternative on my client's old Solaris box was ksh 88). Here's how the loop works:
Code:
tail -0f $ONLINELOG |
while true                           # Loop until a break command
do
  if [[ $go_flag -eq $FALSE ]]
  then
    break
  fi
  read newline
<.... Do my stuff, parsing $newline for a significant event ...>
done

Now how do I send this daemon a message to clean up after itself and exit quietly? Well, before I started that loop, I set up a simple, one-signal trap command:
Code:
trap 'echo Interrupt received; go_flag=$FALSE; break' INT

(I'm not even certain that break will do what I think.) All so very logical! So what's the problem? Smilie

Well, it is overwhelmingly likely that when I send it the "kill -2", my daemon will be sleeping on that "read newline" command. My output log shows that it did catch the signal but it goes right back to sleep on that read!

A Google search [ksh signal break read] showed me I am not alone; the first hit was a 5-year-old posting on this very forum. I was quite unhappy with the conclusion of that thread but even if ksh83v (the latest I've heard of) has fixed the issues discussed in that thread, I have no access to that. But I love to tinker so I added this to the trap handler:
Code:
trap 'echo Interrupt received; go_flag=$FALSE; echo "" >>$ONLINELOG; break' INT

What did I do up there?

I fed an extra empty line to the end of the file being tailed. (Remember, I'm not reading directly from the file but from a pipeline.) Hence, that read is immediately satisfied and the process awakens to see an empty line, continues back at the top of the loop, where it sees that $go_flag is $FALSE and breaks out of the loop.

This kluge worked for me, although it's a fair bet it won't work for everyone. And, of course, for all I know the SA_RESETHAND issue discussed in that post has been fixed.

-- JS, who should have been a teacher. Smilie
# 2  
I don't think the "resethand" issue is related. Your shell has no issue receiving the interrupt, and does exactly what you told it to do -- wait for input. What needs to be told that something is happening is read. How can you do that? Close whatever it's reading from. Killing tail would do it, for example. Or using a named pipe and forcing it to close.

Code:
#!/bin/ksh

# On ctrl-C, close the read-end of the named pipe.
trap 'echo "Closing FIFO" ; exec 5<&-' INT

mkfifo $$ # Create a named pipe file in the current directory

# Open one end of pipe in background, read from log file,
# write into pipe.
# This will hang until we open the other end,
# so we have to put it in the background.
(exec tail -f /var/log/logfile > $$) &

exec 5<$$ # Open the other end in our shell, into file descriptor 5.
rm /tmp/$$ # Clean up mess

# Read from file descriptor 5 until something forces it to close,
# whether it be tail quitting, the pipe closing, or the apocalypse
while read LINE
do
        echo "$LINE"
done <&5

wait # wait for tail to quit.  Closing our end of the pipe ought to force it to quit (it will get SIGPIPE)

echo "Normal exit"

# 3  
Lightbulb Cool solution, Corona!

Corona,
I like it better than my own solution because it would work where I cannot mess with the input file. Smilie I did call my solution a kluge, indicating some dissatisfaction with it.

I may use your technique in the future or I may even start tinkering with it now, although I have started to implement the script across my servers. Pragmatism says let it run as it, for now.

-- JS
This User Gave Thanks to jakesalomon For This Post:
Login or Register for Dates, Times and to Reply

Previous Thread | Next Thread
Thread Tools Search this Thread
Search this Thread:
Advanced Search

Test Your Knowledge in Computers #692
Difficulty: Medium
In 1995, the Santa Cruz Operation (SCO) acquired UnixWare from Novell.
True or False?

7 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

ksh interrupt read instruction with signal

Dear shell experts, I spent last few days porting ksh script from ksh88/SunOS to ksh93/Linux. Basically, things are going well and I do not have too much troubles porting ks88 script to ksh93, but I stuck on one item. Itís about sending and handling the signal. I found two similar... (8 Replies)
Discussion started by: bzk
8 Replies

2. Shell Programming and Scripting

Sleep process not sleeping!

I had a script executing every hour to kill a process. I used loop rather than cron to execute it periodically. But now when I am trying to kill that sleep process of 1 hour its not getting killed. it is taking a new PID everytime I kill. To disable the script commenting is the only option... (1 Reply)
Discussion started by: nixhead
1 Replies

3. Shell Programming and Scripting

Help on sleeping the script

Hi all, How can i specify to sleep for 24 hours in a script Thanks Firestar (5 Replies)
Discussion started by: firestar
5 Replies

4. Shell Programming and Scripting

Trapped in pipe

Hi Is there any way to find out in a single step ( command) the step where the pipe command failed when using multiple commands using pipe . eg : ll *.tar | grep dec | grep december.tar the first step is listing all tar files . Second step constitutes piping that data and doing grep... (5 Replies)
Discussion started by: ultimatix
5 Replies

5. UNIX for Advanced & Expert Users

Trapped Signal HUP

We encountered an issue in our project while using the Interix UNIX (SFU 3.5) and explained our query below. We would be happy if anybody helps us to troubleshoot the problem J In our code the trapping signal for all signals like HUP, INT, QUIT, ILL, TRAP, ABRT, EXCEPT, etc., is initialized in... (4 Replies)
Discussion started by: RAMESHPRABUDASS
4 Replies

6. UNIX for Advanced & Expert Users

autosys sample resumes

Hi all, Can anybody send the autosys developer sample resumes. If this is not the correct place to ask please let me know where can I get them. Your help would be appreciated. Thanks Renuka (0 Replies)
Discussion started by: renukasaga01
0 Replies

7. Shell Programming and Scripting

perl: sleeping during a command

hello everyone, i am attempting to run the sleep function (i've also tried select) during the execution of a command to mimic a status. for example: # this is a terminal screen # here the process is executed # below this a status is displayed while the command executes like so:... (3 Replies)
Discussion started by: effigy
3 Replies

Featured Tech Videos