<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>