FAQ Search Today's Posts Mark Forums Read
» Video Reviews

» Linux Archive

Linux-archive is a website aiming to archive linux email lists and to make them easily accessible for linux users/developers.


» Sponsor

» Partners

» Sponsor

Go Back   Linux Archive > Redhat > Device-mapper Development

 
 
LinkBack Thread Tools
 
Old 03-22-2011, 04:42 PM
Ales Kozumplik
 
Default shutdown: kill processes in the anaconda process group.

Previously killall5 omitted the init's session (which includes the anaconda
process group) and anaconda and everything spawned from there (including
the vnc server) survived both the killall5 calls.

Related: rhbz#679397
---
loader/init.c | 2 --
loader/loader.c | 3 +++
loader/shutdown.c | 22 ++++++++++++++++++++--
3 files changed, 23 insertions(+), 4 deletions(-)

diff --git a/loader/init.c b/loader/init.c
index 9c193b4..65df89c 100644
--- a/loader/init.c
+++ b/loader/init.c
@@ -827,8 +827,6 @@ int main(int argc, char **argv) {

printf("running install...
");

- setsid();
-
if (!(installpid = fork())) {
/* child */
*argvp++ = "/sbin/loader";
diff --git a/loader/loader.c b/loader/loader.c
index aac816e..d4437c3 100644
--- a/loader/loader.c
+++ b/loader/loader.c
@@ -2393,6 +2393,9 @@ int main(int argc, char ** argv) {

do {
if (!(pid = fork())) {
+ /* Create a new process group that we can easily kill off later. */
+ setpgid(0, 0);
+ /* This is where the Anaconda python process is started. */
if (execv(anacondaArgs[0], anacondaArgs) == -1) {
fprintf(stderr,"exec of anaconda failed: %m
");
doExit(1);
diff --git a/loader/shutdown.c b/loader/shutdown.c
index bb32359..8535a1b 100644
--- a/loader/shutdown.c
+++ b/loader/shutdown.c
@@ -38,11 +38,27 @@ void disableSwap(void);
void unmountFilesystems(void);

static void performTerminations(void) {
+ /* First of all kill everything in the anaconda process group. This won't
+ hit any daemons spawned from anaconda, those usually call setsid(). */
+ char buf[256];
+ int fd, anaconda_pid = 0;
+ if ((fd = open("/var/run/anaconda.pid", O_RDONLY)) >= 0 ) {
+ if (read(fd, buf, 256) > 0) {
+ anaconda_pid = atol(buf);
+ }
+ }
+ if (anaconda_pid > 0) {
+ printf("terminating anaconda...");
+ kill(-anaconda_pid, SIGTERM);
+ printf("done
");
+ }
+
+ /* Next, kill everything except what is inside the init's session or
+ excluded in donotkill. */
FILE *f;
char *donotkill[] = {"mdmon", "NetworkManager", "dhclient", NULL};
- char buf[256], omit[256], oarg[64];
+ char omit[256], oarg[64];
char **procname, *pid;
-
/* find some pids so we can omit them from killall5 */
*omit = '';
for (procname=donotkill; *procname; procname++) {
@@ -64,12 +80,14 @@ static void performTerminations(void) {

sync();
printf("sending termination signals...");
+ fflush(stdout);
sprintf(buf, "/sbin/killall5 -15%s", omit);
system(buf);
sleep(2);
printf("done
");

printf("sending kill signals...");
+ fflush(stdout);
sprintf(buf, "/sbin/killall5 -9%s", omit);
system(buf);
sleep(2);
--
1.7.3.3

_______________________________________________
Anaconda-devel-list mailing list
Anaconda-devel-list@redhat.com
https://www.redhat.com/mailman/listinfo/anaconda-devel-list
 

Thread Tools




All times are GMT. The time now is 03:55 AM.

VBulletin, Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.
Content Relevant URLs by vBSEO ©2007, Crawlability, Inc.
Copyright 2007 - 2008, www.linux-archive.org