Applied patch from Daniel Povey which should allow killall5/pidof to
avoid locking up if it encounters stopped or zombie processes due to broken NFS mount points. This should allow Debian bug #719273 to be closed.
This commit is contained in:
parent
b4f8539153
commit
1b659c8ebe
@ -17,6 +17,10 @@ sysvinit (2.92) unreleased; urgency=low
|
|||||||
flag may not properly shut down network interfaces if the interface
|
flag may not properly shut down network interfaces if the interface
|
||||||
does not have an IP address.
|
does not have an IP address.
|
||||||
Addresses Debian bug #361935.
|
Addresses Debian bug #361935.
|
||||||
|
* Applied patch from Daniel Povey which should allow killall5/pidof to
|
||||||
|
avoid locking up if it encounters stopped or zombie processes
|
||||||
|
due to broken NFS mount points.
|
||||||
|
This should allow Debian bug #719273 to be closed.
|
||||||
|
|
||||||
|
|
||||||
sysvinit (2.91) world; urgency=low
|
sysvinit (2.91) world; urgency=low
|
||||||
|
@ -153,7 +153,7 @@ about this.
|
|||||||
.PP
|
.PP
|
||||||
When \fBinit\fP is requested to change the runlevel, it sends the
|
When \fBinit\fP is requested to change the runlevel, it sends the
|
||||||
warning signal \s-1\fBSIGTERM\fP\s0 to all processes that are undefined
|
warning signal \s-1\fBSIGTERM\fP\s0 to all processes that are undefined
|
||||||
in the new runlevel. It then waits 5 seconds before forcibly
|
in the new runlevel. It then waits 3 seconds before forcibly
|
||||||
terminating these processes via the \s-1\fBSIGKILL\fP\s0 signal.
|
terminating these processes via the \s-1\fBSIGKILL\fP\s0 signal.
|
||||||
Note that \fBinit\fP assumes that all these processes (and their
|
Note that \fBinit\fP assumes that all these processes (and their
|
||||||
descendants) remain in the same process group which \fBinit\fP
|
descendants) remain in the same process group which \fBinit\fP
|
||||||
|
@ -2224,7 +2224,7 @@ void re_exec(void)
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* We shouldn't be here, something failed.
|
* We shouldn't be here, something failed.
|
||||||
* Bitch, close the state pipe, unblock signals and return.
|
* Close the state pipe, unblock signals and return.
|
||||||
*/
|
*/
|
||||||
init_freeenv(env);
|
init_freeenv(env);
|
||||||
close(fd);
|
close(fd);
|
||||||
|
@ -484,6 +484,7 @@ int readproc(int do_stat)
|
|||||||
unsigned long startcode, endcode;
|
unsigned long startcode, endcode;
|
||||||
int pid, f;
|
int pid, f;
|
||||||
ssize_t len;
|
ssize_t len;
|
||||||
|
char process_status[11];
|
||||||
|
|
||||||
/* Open the /proc directory. */
|
/* Open the /proc directory. */
|
||||||
if (chdir("/proc") == -1) {
|
if (chdir("/proc") == -1) {
|
||||||
@ -567,11 +568,20 @@ int readproc(int do_stat)
|
|||||||
|
|
||||||
/* Get session, startcode, endcode. */
|
/* Get session, startcode, endcode. */
|
||||||
startcode = endcode = 0;
|
startcode = endcode = 0;
|
||||||
|
/*
|
||||||
if (sscanf(q, "%*c %*d %*d %d %*d %*d %*u %*u "
|
if (sscanf(q, "%*c %*d %*d %d %*d %*d %*u %*u "
|
||||||
"%*u %*u %*u %*u %*u %*d %*d "
|
"%*u %*u %*u %*u %*u %*d %*d "
|
||||||
"%*d %*d %*d %*d %*u %*u %*d "
|
"%*d %*d %*d %*d %*u %*u %*d "
|
||||||
"%*u %lu %lu",
|
"%*u %lu %lu",
|
||||||
&p->sid, &startcode, &endcode) != 3) {
|
&p->sid, &startcode, &endcode) != 3) {
|
||||||
|
*/
|
||||||
|
if (sscanf(q, "%10s %*d %*d %d %*d %*d %*u %*u "
|
||||||
|
"%*u %*u %*u %*u %*u %*d %*d "
|
||||||
|
"%*d %*d %*d %*d %*u %*u %*d "
|
||||||
|
"%*u %lu %lu",
|
||||||
|
process_status,
|
||||||
|
&p->sid, &startcode, &endcode) != 4) {
|
||||||
|
|
||||||
p->sid = 0;
|
p->sid = 0;
|
||||||
nsyslog(LOG_ERR, "can't read sid from %s\n",
|
nsyslog(LOG_ERR, "can't read sid from %s\n",
|
||||||
path);
|
path);
|
||||||
@ -586,6 +596,18 @@ int readproc(int do_stat)
|
|||||||
if (startcode == 0 && endcode == 0)
|
if (startcode == 0 && endcode == 0)
|
||||||
p->kernel = 1;
|
p->kernel = 1;
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
|
if ( (strchr(process_status, 'D') != NULL) ||
|
||||||
|
(strchr(process_status, 'Z') != NULL) ){
|
||||||
|
/* Ignore zombie processes or processes in
|
||||||
|
disk sleep, as attempts
|
||||||
|
to access the stats of these will
|
||||||
|
sometimes fail. */
|
||||||
|
if (p->argv0) free(p->argv0);
|
||||||
|
if (p->argv1) free(p->argv1);
|
||||||
|
if (p->statname) free(p->statname);
|
||||||
|
free(p);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
/* Process disappeared.. */
|
/* Process disappeared.. */
|
||||||
if (p->argv0) free(p->argv0);
|
if (p->argv0) free(p->argv0);
|
||||||
|
Loading…
Reference in New Issue
Block a user