diff --git a/src/libraries/System.Diagnostics.Process/tests/ProcessTests.Unix.cs b/src/libraries/System.Diagnostics.Process/tests/ProcessTests.Unix.cs index 99272c05f0c2e3..a1d5d4f50f2512 100644 --- a/src/libraries/System.Diagnostics.Process/tests/ProcessTests.Unix.cs +++ b/src/libraries/System.Diagnostics.Process/tests/ProcessTests.Unix.cs @@ -159,9 +159,9 @@ public void ProcessStart_UseShellExecute_OnUnix_SuccessWhenProgramInstalled(bool [PlatformSpecific(~TestPlatforms.OSX)] // On OSX, ProcessName returns the script interpreter. public void ProcessNameMatchesScriptName() { - string scriptName = GetTestFileName(); + const string scriptName = nameof(ProcessNameMatchesScriptName); string filename = Path.Combine(TestDirectory, scriptName); - File.WriteAllText(filename, $"#!/bin/sh\nsleep 600\n"); // sleep 10 min. + File.WriteAllText(filename, $"#!/bin/sh\n/bin/sleep 600\n"); // sleep 10 min. ChMod(filename, "744"); // set x-bit using (var process = Process.Start(new ProcessStartInfo { FileName = filename })) @@ -171,14 +171,26 @@ public void ProcessNameMatchesScriptName() string stat = File.ReadAllText($"/proc/{process.Id}/stat"); Assert.Contains($"({scriptName.Substring(0, 15)})", stat); string cmdline = File.ReadAllText($"/proc/{process.Id}/cmdline"); - Assert.Equal($"/bin/sh\0{filename}\0", cmdline); - Assert.Equal(scriptName, process.ProcessName); + // cmdLine can sometimes be null: https://github.com/dotnet/runtime/issues/13757 + // according to docs, it's when the process is a zombie: https://man7.org/linux/man-pages/man5/proc.5.html + if (string.IsNullOrEmpty(cmdline)) + { + Assert.True(process.HasExited, $"/proc/{process.Id}/cmdline was empty, but the process was not a zombie"); + } + else + { + Assert.Equal($"/bin/sh\0{filename}\0", cmdline); + Assert.Equal(scriptName, process.ProcessName); + } } finally { - process.Kill(); - process.WaitForExit(); + if (!process.HasExited) + { + process.Kill(); + process.WaitForExit(); + } } } }