fix for background jobs killed by SIGTERM being marked as notified

This commit is contained in:
Chet Ramey
2024-02-09 10:56:43 -05:00
parent 092aa45bcc
commit fbc7d97de6
4 changed files with 34 additions and 12 deletions
+11 -1
View File
@@ -1,4 +1,4 @@
\
12/6/2020
---------
@@ -8561,3 +8561,13 @@ bashline.c
doc/bash.1,lib/readline/doc/readline.3
- minor updates to handle old versions of troff and groff warnings
Fixes from G. Branden Robinson <g.branden.robinson@gmail.com>
2/7
---
jobs.c
- notify_of_job_status: in non-interactive shells, if we're not going
to print information about a terminated background job
(SIGINT/SIGTERM/SIGPIPE), don't mark it as notified, in the same
way that we don't mark background jobs that exit cleanly as notified
Inspired by a discussion with Robert Elz <kre@munnari.oz.au> and
https://lists.gnu.org/archive/html/bug-bash/2024-01/msg00189.html
+1 -1
View File
@@ -45,7 +45,7 @@
when a job like `cat jobs.c | exit 1' terminates due to a SIGPIPE. */
#define DONT_REPORT_SIGPIPE
/* Define DONT_REPORT_SIGTERM if you don't want to see `Terminates' message
/* Define DONT_REPORT_SIGTERM if you don't want to see `Terminated' message
when a job exits due to SIGTERM, since that's the default signal sent
by the kill builtin. */
#define DONT_REPORT_SIGTERM
+20 -10
View File
@@ -4282,6 +4282,19 @@ notify_of_job_status (void)
((DEADJOB (job) && IS_FOREGROUND (job) == 0) || STOPPED (job)))
continue;
/* Do the same thing and don't print anything or mark as notified
for the signals we're not going to report on */
else if (startup_state == 0 && DEADJOB (job) && IS_FOREGROUND (job) == 0 &&
WIFSIGNALED (s) && (termsig == SIGINT
#if defined (DONT_REPORT_SIGTERM)
|| termsig == SIGTERM
#endif
#if defined (DONT_REPORT_SIGPIPE)
|| termsig == SIGPIPE
#endif
))
continue;
/* If job control is disabled, don't print the status messages.
Mark dead jobs as notified so that they get cleaned up. If
startup_state == 2 and subshell_environment has the
@@ -4304,7 +4317,7 @@ notify_of_job_status (void)
/* Print info on jobs that are running in the background,
and on foreground jobs that were killed by anything
except SIGINT (and possibly SIGPIPE). */
except SIGINT (and possibly SIGTERM and SIGPIPE). */
switch (JOBSTATE (job))
{
case JDEAD:
@@ -4324,6 +4337,7 @@ notify_of_job_status (void)
}
else if (IS_FOREGROUND (job))
{
/* foreground jobs, interactive and non-interactive shells */
#if !defined (DONT_REPORT_SIGPIPE)
if (termsig && WIFSIGNALED (s) && termsig != SIGINT)
#else
@@ -4337,10 +4351,13 @@ notify_of_job_status (void)
fprintf (stderr, "\n");
}
/* foreground jobs that exit cleanly */
jobs[job]->flags |= J_NOTIFIED;
}
else if (job_control)
{
/* background jobs with job control, interactive and
non-interactive shells */
if (dir == 0)
dir = current_working_directory ();
pretty_print_job (job, JLIST_STANDARD, stderr);
@@ -4349,16 +4366,9 @@ notify_of_job_status (void)
_("(wd now: %s)\n"), polite_directory_format (dir));
}
/* This is where we set J_NOTIFIED for background jobs in
non-interactive shells without job control enabled that are
killed by SIGINT or SIGTERM (DONT_REPORT_SIGTERM) or SIGPIPE
(DONT_REPORT_SIGPIPE) as long as those signals are not
trapped, or that exit cleanly.
Interactive shells without job control enabled are handled
/* Interactive shells without job control enabled are handled
above. */
/* XXX - if we want to arrange to keep these jobs in the jobs
list, instead of making them eligible to move to bgpids,
this is where to change things. */
/* XXX - this is a catch-all in case we missed a state */
jobs[job]->flags |= J_NOTIFIED;
break;
+2
View File
@@ -11,6 +11,8 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
LC_ALL=en_US.UTF-8
# this should echo nothing
printf '%ls'
# this should echo a null byte