<p>pespin <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-gsm-tester/+/17125">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Jenkins Builder: Verified
  pespin: Looks good to me, approved

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">remote: Improve wrapper script handling proper exit of ssh-remote processes<br><br>Improvements include:<br>* Avoid race condition between receiving signal and process not yet<br>  started<br>* Make sure process is killed with -9 if process is still alive a while after<br>  we killed it (SIGINT, SIGTERM). This is useful for processes which<br>  sometimes hang during shutdown like srsue in some conditions.<br><br>Change-Id: I3c656b008a3c2b2bb453a59e51d338cb272fa50b<br>---<br>M src/osmo_gsm_tester/remote.py<br>1 file changed, 41 insertions(+), 12 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/osmo_gsm_tester/remote.py b/src/osmo_gsm_tester/remote.py</span><br><span>index 771f2b8..65c621e 100644</span><br><span>--- a/src/osmo_gsm_tester/remote.py</span><br><span>+++ b/src/osmo_gsm_tester/remote.py</span><br><span>@@ -59,20 +59,49 @@</span><br><span>         wrapper_script = self.run_dir.new_file(RemoteHost.WRAPPER_SCRIPT)</span><br><span>         with open(wrapper_script, 'w') as f:</span><br><span>             r = """#!/bin/bash</span><br><span style="color: hsl(0, 100%, 40%);">-            mypid=0</span><br><span style="color: hsl(0, 100%, 40%);">-            sign_handler() {</span><br><span style="color: hsl(0, 100%, 40%);">-                    sig=$1</span><br><span style="color: hsl(0, 100%, 40%);">-                    echo "received signal handler $sig, killing $mypid"</span><br><span style="color: hsl(0, 100%, 40%);">-                    kill $mypid</span><br><span style="color: hsl(120, 100%, 40%);">+            LOGFILE=/tmp/yes</span><br><span style="color: hsl(120, 100%, 40%);">+            kill_pid(){</span><br><span style="color: hsl(120, 100%, 40%);">+                mypid=$1</span><br><span style="color: hsl(120, 100%, 40%);">+                kill $mypid</span><br><span style="color: hsl(120, 100%, 40%);">+                if ! kill -0 $mypid; then</span><br><span style="color: hsl(120, 100%, 40%);">+                    return</span><br><span style="color: hsl(120, 100%, 40%);">+                fi</span><br><span style="color: hsl(120, 100%, 40%);">+                echo "sleeping some time waiting for child to die..." >>$LOGFILE</span><br><span style="color: hsl(120, 100%, 40%);">+                sleep 5</span><br><span style="color: hsl(120, 100%, 40%);">+                if ! kill -0 $mypid; then</span><br><span style="color: hsl(120, 100%, 40%);">+                    return</span><br><span style="color: hsl(120, 100%, 40%);">+                fi</span><br><span style="color: hsl(120, 100%, 40%);">+                echo "kill -9 the process and wait!" >>$LOGFILE</span><br><span style="color: hsl(120, 100%, 40%);">+                kill -9 $mypid</span><br><span style="color: hsl(120, 100%, 40%);">+                wait $mypid</span><br><span>             }</span><br><span style="color: hsl(0, 100%, 40%);">-            trap 'sign_handler SIGTERM' SIGTERM</span><br><span style="color: hsl(0, 100%, 40%);">-            trap 'sign_handler SIGINT' SIGINT</span><br><span style="color: hsl(0, 100%, 40%);">-            trap 'sign_handler SIGHUP' SIGHUP</span><br><span style="color: hsl(120, 100%, 40%);">+            prep_sighandler() {</span><br><span style="color: hsl(120, 100%, 40%);">+                unset term_child_pid</span><br><span style="color: hsl(120, 100%, 40%);">+                unset term_kill_needed</span><br><span style="color: hsl(120, 100%, 40%);">+                trap 'sign_handler SIGTERM' SIGTERM</span><br><span style="color: hsl(120, 100%, 40%);">+                trap 'sign_handler SIGINT' SIGINT</span><br><span style="color: hsl(120, 100%, 40%);">+                trap 'sign_handler SIGHUP' SIGHUP</span><br><span style="color: hsl(120, 100%, 40%);">+                echo "script started, traps set" >$LOGFILE</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span style="color: hsl(120, 100%, 40%);">+            sign_handler() {</span><br><span style="color: hsl(120, 100%, 40%);">+                sig=$1</span><br><span style="color: hsl(120, 100%, 40%);">+                echo "$sig -> ${term_child_pid}" >>$LOGFILE</span><br><span style="color: hsl(120, 100%, 40%);">+                echo "received signal handler $sig, killing ${term_child_pid}" >>$LOGFILE</span><br><span style="color: hsl(120, 100%, 40%);">+                kill_pid ${term_child_pid}</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span style="color: hsl(120, 100%, 40%);">+            wait_sighandler()</span><br><span style="color: hsl(120, 100%, 40%);">+            {</span><br><span style="color: hsl(120, 100%, 40%);">+                term_child_pid=$!</span><br><span style="color: hsl(120, 100%, 40%);">+                if [ "${term_kill_needed}" ]; then</span><br><span style="color: hsl(120, 100%, 40%);">+                    kill_pid "${term_child_pid}"</span><br><span style="color: hsl(120, 100%, 40%);">+                fi</span><br><span style="color: hsl(120, 100%, 40%);">+                echo "waiting for ${term_child_pid}" >>$LOGFILE</span><br><span style="color: hsl(120, 100%, 40%);">+                wait ${term_child_pid}</span><br><span style="color: hsl(120, 100%, 40%);">+                echo "process ${term_child_pid} finished" >>$LOGFILE</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span style="color: hsl(120, 100%, 40%);">+            prep_sighandler</span><br><span>             $@ &</span><br><span style="color: hsl(0, 100%, 40%);">-            mypid=$!</span><br><span style="color: hsl(0, 100%, 40%);">-            echo "waiting for $mypid"</span><br><span style="color: hsl(0, 100%, 40%);">-            wait $mypid</span><br><span style="color: hsl(0, 100%, 40%);">-            echo "process $mypid finished"</span><br><span style="color: hsl(120, 100%, 40%);">+            wait_sighandler</span><br><span>             """</span><br><span>             f.write(r)</span><br><span>         st = os.stat(wrapper_script)</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-gsm-tester/+/17125">change 17125</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/c/osmo-gsm-tester/+/17125"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-gsm-tester </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I3c656b008a3c2b2bb453a59e51d338cb272fa50b </div>
<div style="display:none"> Gerrit-Change-Number: 17125 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>