Subject: Re: Hanging cygwin processes in Windows Server 2019
From: Brian Inglis <[email-masked]>
To: [email-masked]
Cc: "[email-masked]" <[email-masked]>
Date: Tue, 19 Oct 2021 13:23:27 -0600
List-Id: General Cygwin discussions and problem reports <cygwin.cygwin.com>

On 2021-10-19 11:56, chris.hardison wrote:
> On Tuesday, October 19, 2021, 12:11:42 PM EDT, Brian Inglis wrote:
> On 2021-10-18 06:01, chris.hardison wrote:
>> On Thursday, September 30, 2021, 01:26:37 PM EDT, chris.hardison wrote:
>>> My cygwin install looks good and things seem to work perfectly
>>> for some time (hours or days), then a cygwin process started by a
>>> windows process that is usually a child process of a windows
>>> service written in perl will hang and then most all other cygwin
>>> processes will hang or take a very long time to return. The
>>> simplest example is a call to \cygwin\bin\ps from powershell.
>>> That normally returns with sub-second response time. Once the
>>> problem occurs that call to \cygwin\bin\ps will often take
>>> several minutes to return. I've found that killing all cygwin
>>> processes will temporarily resolve the problem. >>> I've read about redirecting NUL to stdin when making the call to
>>> cygwin processes from windows and that didn't seem to help.
>>> I've tried "set-processmitigation -name \cygwin\bin\ps.exe 
>>> -disable ForceRelocateImages" with no real benefit.
>>> I've also tried "\cygwin\bin\dash -c /bin/rebaseall" on startup 
>>> before the sshd service starts and that didn't seem to help.
>>> Any suggestions on how to prevent this problem will be greatly 
>>> appreciated.

>> The problem seems to be that my cygwin processes that are always
>> the child or grandchild of a windows service use a console device
>> that is block buffered rather than character buffered. So using
>> mintty to start those processes forces character buffered which
>> solves the problem. I'm looking for cleaner way to force character
>> buffered IO. Here's an example of the change:
>> From
>> chomp(@output = `/cygwin/bin/ps -W`);TO
>> chomp(@output = `/cygwin/bin/mintty.exe -w hide /bin/dash -c 
>> "/bin/ps -W > /tmp/${PID}.out"; sleep 1; type 
>> /cygwin/tmp/${PID}.out; del /cygwin/tmp/${PID}.out`);
>> Hopefully someone can suggest a simpler solution.

> Most Cygwin processes don't care about buffering, as they may be line
> or character buffered from the terminal but block buffered when used
> with pipe or file I/O.
> Try using stdbuf(1) instead of mintty to change buffering.
> You use it as a command prefix like nohup or time.
> Perl may also have ways of changing I/O buffering internally.

 > Thanks for the feedback.  I came across stdbuf earlier today and 
thought for sure that was the answer but when I showed it to my 
co-worker he said he had already tied it with no luck, both with -i0 -e0 
-o0 and with -oL.
 > Actually, what is working is:`\\cygwin\\bin\\mintty.exe -w hide 
/bin/dash -c "/bin/ps -W > /tmp/${PID}.out"`;
 > chomp(@output = `type \\cygwin\\tmp\\${PID}.out && del 
\\cygwin\\tmp\\${PID}.out`);
 > I'm still hoping for a better solution.

You use perl and Cygwin has package perl-IO-Tty which provides perl 
modules IO:Tty and IO::Pty.
You may be able to build a solution equivalent to mintty using one or 
both of those modules.

-- 
Take care. Thanks, Brian Inglis, Calgary, Alberta, Canada

This email may be disturbing to some readers as it contains
too much technical detail. Reader discretion is advised.
[Data in binary units and prefixes, physical quantities in SI.]

-- 
Problem reports:      https://cygwin.com/problems.html
FAQ:                  https://cygwin.com/faq/
Documentation:        https://cygwin.com/docs.html
Unsubscribe info:     https://cygwin.com/ml/#unsubscribe-simple