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...\n"); - 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\n"); 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\n"); + } + + /* 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 = '\0'; 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\n"); 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@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/anaconda-devel-list