Application Cleanup during Linux Shutdown


 
Thread Tools Search this Thread
Top Forums Programming Application Cleanup during Linux Shutdown
# 1  
Old 02-04-2010
Application Cleanup during Linux Shutdown

I'm trying to do some cleanup (write open files) when Linux shuts down. I thought the right method would be to trap SIGTERM and do the necessary processing. Here's my sample code:

Code:
#include <stdio.h> // for File I/O
#include <signal.h> // for signals
#include <unistd.h> // for sleep()

void handler(int signal)
{
    FILE *out=fopen("test.txt","at");
    if (out)
    {
        fprintf(out,"got %d\n",signal);
        fclose(out);
    }
}

int main()
{
    signal(SIGTERM,handler);
    signal(SIGINT,handler);
    sleep(30);
}

When I run this, and press Ctrl-C, it writes "got 2" to test.txt. However, if I logout/reboot, nothing is written to the file.

Any help or ideas would be appreciated!

-Ron
# 2  
Old 02-04-2010
Is 30 seconds really a long enough wait?

I wonder if it's getting a SIGHUP or SIGPIPE from a forcibly closed ssh connection or some such.

Or it could even be that, by the time it's getting killed, the filesystem's remounted as read-only.
# 3  
Old 02-09-2010
App cleanup on shutdown

Interesting thought... but yes, I am fully logged out well before 30 seconds. I just run the app:
% ./test &
...and then logout. From start to finish is only about 10 seconds.
If the file system is read-only at that point, how would an application do any cleanup that required writing data to disk.

This just seems like it should be such a common need.. I am quite befuddled at it not being simpler!

-Ron
# 4  
Old 02-09-2010
Quote:
Originally Posted by whatisron
Interesting thought... but yes, I am fully logged out well before 30 seconds. I just run the app:
% ./test &
...and then logout.
What shell are you using? If it's bash, you need to run 'disown' after that so bash doesn't try and wait for it.
Quote:
If the file system is read-only at that point, how would an application do any cleanup that required writing data to disk.
Applications that need cleanup should've quit from earlier signals anyhow.
Quote:
This just seems like it should be such a common need.. I am quite befuddled at it not being simpler!
It's supposed to work the way you think; I'm sure there's something obvious we're missing. I'd make a few small changes to your source:

Code:
#include <stdio.h> // for File I/O
#include <signal.h> // for signals
#include <unistd.h> // for sleep()

void handler(int sig)
{
        /* Just print to stderr and redirect 2>> test.txt in the shell */
    fprintf(stderr, "got %d\n", signal);

    signal(sig, handler); // let signal be caught again
}

int main()
{
    signal(SIGTERM,handler);
    signal(SIGINT,handler);
    signal(SIGQUIT, handler); // Maybe we're getting QUIT first?
    signal(SIGHUP, handler); // If the terminal closes, we might get this
    signal(SIGPIPE, handler); // Don't know why we'd get this, but check anyway
    while(1) // loop forever with most signals trapped, impolitely waiting for a kill -9 ;)
        sleep(30);
}


Last edited by Corona688; 02-09-2010 at 06:58 PM.. Reason: add sighup, sigpipe
# 5  
Old 02-12-2010
Unfortunately, I tried these with no luck. I added the extra signals and added the while(1) just to be certain my application wouldn't exit before logout killed it.

Still, I can press Ctrl-C and that gets caught just fine, but nothing on logout. I also tried launching the application from the Actions/Run Application menu just to be sure it wasn't related to running it from the shell. No difference.

I appreciate all the suggestions, and if you have any others, I'm all ears!!!

Thanks,
Ron
# 6  
Old 02-12-2010
None of the printf() family are async-signal safe. Using them in a signal handler could be deadlocking the app.
# 7  
Old 02-12-2010
Not even printing to stderr? OK, fine...

Code:
void handler(int sig)
{
        char buf[128];
        sprintf(buf, "got signal %d\n", sig);
        write(STDERR_FILENO, buf, strlen(buf));
        signal(sig, handler);
}


Last edited by Corona688; 02-12-2010 at 11:26 AM..
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. UNIX for Beginners Questions & Answers

Linux SuSE SLES 8 error..unable to issue shutdown command

the only way we can power off is if we actually press power button on server. Running on HP DL-G4. from root, when we issue command it just returns to root prompt. (1 Reply)
Discussion started by: amexboy
1 Replies

2. UNIX for Advanced & Expert Users

Application Script didn't run during AIX shutdown using RC directories

Hi, I am trying to bring down the application gracefully before bringing down AIX OS/LPAR using RC directories. Issue: Application script is not working properly during/before AIX OS/LPAR shutdown. looks like "rc.d" directories doesn't recognize Kill script. But Startup script (using... (0 Replies)
Discussion started by: System Admin 77
0 Replies

3. Shell Programming and Scripting

Shell to cleanup Linux logs

Hi,Looking for any generic shell scripts to cleanup systemlogs. Thanks (2 Replies)
Discussion started by: tommy812
2 Replies

4. UNIX for Dummies Questions & Answers

How to shutdown Linux box with user confirmation?

Hi Guru's Am looking for linux reboot command which get executed after user confirmation .Can someone please help me with this.:confused::confused::confused: (6 Replies)
Discussion started by: kapil514
6 Replies

5. OS X (Apple)

Adobe application cleanup

I am trying to come up with a universal way of cleaning up after CS5 (and 5.5) installs. The history is this: adobe has a deployment tool called AAMEE that lets you re-package items and deploy them. Unfortunately it's very messy and leaves Application folders (and pieces of the apps) that do not... (1 Reply)
Discussion started by: kleinboy
1 Replies

6. UNIX and Linux Applications

Timer application in linux

Hello everyone, It is good to be here. I am a newbie to Linux.Can anyone help me in designing a timer application. The timer has to start.And after certain time interval the program should call a function continuously.It should not be in sleep mode.During the course of that time interval the... (0 Replies)
Discussion started by: Harry443
0 Replies

7. Solaris

Need help "application start up & shutdown"

Hello, i have an application,say X application. When the machine is start-up,i want this application is the last module/application to run & when I shutdown the machine i want this application to be the 1st one to shutdown! i.e. last >>start-up 1st >>shutdown Any help? (1 Reply)
Discussion started by: ahmedamer12
1 Replies

8. AIX

stop application befor shutdown

Stop the application before shutdown the server .. I have application need to be started with the system and also need to be stop before shutdown the system This is the path of the application: /usr/appstart /usr/appstop to start the application with the startup of the... (2 Replies)
Discussion started by: Mr.AIX
2 Replies

9. UNIX for Dummies Questions & Answers

Script to force Oracle database shutdown when shutdown immediate does not work

I have Oracle 9i R2 on AIX 5.2. My Database is running in shared server mode (MTS). Sometimes when I shutdown the database it shutsdown cleanly in 4-5 mints and sometimes it takes good 15-20 minutes and then I get some ora-600 errors and only way to shutdown is by opening another session and... (7 Replies)
Discussion started by: aixhp
7 Replies

10. Red Hat

change the shutdown sequence in red hat linux

Hi, I use red hat linux kernel 2.6 I want to add the application shutdown in shutdown sequence . I add the K script in /etc/rc.d/ all sub directory for all running level . But the auto shutdown application is not appear when I type "shutdown -r now" .. There is no indication the application... (5 Replies)
Discussion started by: chuikingman
5 Replies
Login or Register to Ask a Question