<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css" style="display:none;"><!-- P {margin-top:0;margin-bottom:0;} --></style>
</head>
<body dir="ltr">
<div id="divtagdefaultwrapper" style="font-size:12pt;color:#000000;font-family:Calibri,Arial,Helvetica,sans-serif;" dir="ltr">
<p><span style="font-family:monospace">&gt;2017-01-12 11:20 GMT&#43;03:00 Dmitry Safonov &lt;0x7f454c46@gmail.com&gt;:
<br>
&gt;&gt; 2017-01-12 9:27 GMT&#43;03:00 Vitaly Ostrosablin &lt;vostrosablin@virtuozzo.com&gt;: <br>
&gt;&gt;&gt; cat *.pid works when we have only one running process at any moment. <br>
&gt;&gt;&gt; That's because pidfiles contain no newlines and cat will just <br>
&gt;&gt;&gt; concatenate content of all files present in directory. So, e.g., if we <br>
&gt;&gt;&gt; have pidfiles: <br>
&gt;&gt;&gt; <br>
&gt;&gt;&gt; 31338 <br>
&gt;&gt;&gt; 31359 <br>
&gt;&gt;&gt; 31880 <br>
&gt;&gt;&gt; 31884 <br>
&gt;&gt;&gt; 31889 <br>
&gt;&gt;&gt; <br>
&gt;&gt;&gt; cat will build following string from those pidfiles: <br>
&gt;&gt;&gt; <br>
&gt;&gt;&gt; 3133831359318803188431889 <br>
&gt;&gt; <br>
&gt;&gt; I don't mind the patch, but your explanation looks obiviously wrong: <br>
&gt;&gt; [test]$ echo 123 &gt; 1.txt <br>
&gt;&gt; [test]$ echo 456 &gt; 2.txt <br>
&gt;&gt; [test]$ cat *.txt <br>
&gt;&gt; 123 <br>
&gt;&gt; 456 <br>
&gt;&gt; [test]$ cat Makefile <br>
&gt;&gt; all: <br>
&gt;&gt; &nbsp;&nbsp;&nbsp;&nbsp;cat *.txt <br>
&gt;&gt; [test]$ make <br>
&gt;&gt; cat *.txt <br>
&gt;&gt; 123 <br>
&gt;&gt; 456 <br>
&gt; <br>
&gt;[test]$ cat Makefile <br>
&gt;all: <br>
&gt; &nbsp;&nbsp;&nbsp;echo `cat *.txt` <br>
&gt;[test]$ make <br>
&gt;echo `cat *.txt` <br>
&gt;123 456 <br>
&gt;[test]$ <br>
&gt;&nbsp;</span></p>
<p><span style="font-family:monospace"><br>
</span></p>
<p><font face="monospace">It doesn't look really wrong. What cat does is just a concatenation</font></p>
<p><font face="monospace">of files content and doesn't modify it in any way. What you put into</font></p>
<p><font face="monospace">files is what you get. So, concatenating '123\n' and '456\n' gives</font></p>
<p><font face="monospace"><br>
</font></p>
<p><font face="monospace">123</font></p>
<p><font face="monospace">456</font></p>
<p><font face="monospace"><br>
</font></p>
<p><font face="monospace">Now let's do same with concatenation of '123' and '456'. The result</font></p>
<p><font face="monospace">is clearly:</font></p>
<p><font face="monospace"><br>
</font></p>
<p><font face="monospace">123456</font></p>
<p><font face="monospace"><br>
</font></p>
<p><font face="monospace">cat doesn't append it's own newlines.&nbsp;</font><span style="font-size: 12pt;">Now let's use echo with no-newline</span></p>
<p><span style="font-size: 12pt;">option:</span></p>
<p><span style="font-size: 12pt;"><br>
</span></p>
<p><span style="font-size: 12pt;"></p>
<div> echo -n 123 &gt; 1.txt</div>
<div> echo -n 456 &gt; 2.txt</div>
<div> cat *.txt</div>
<div>123456%</div>
<div><br>
</div>
<div>(Percent sign at end in zsh&nbsp;means that output ended without newline being</div>
<div>printed.)</div>
<div><br>
</div>
<div>Here's how we write the pidfile in zdtm lib/test.c:</div>
<div><br>
</div>
<div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>if (dprintf(fd, &quot;%d&quot;, pid) == -1) {</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>fprintf(stderr, &quot;Can't write in the file %s: %m\n&quot;, tmp);</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>goto err_c;</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>}</div>
</div>
<div><br>
</div>
<div>It just prints %d, i.e. pid only, without newline at end. So, if we were to cat</div>
<div>all pidfiles, we'll just&nbsp;<span style="font-size: 12pt;">get a single huge undelimited number.</span></div>
</span>
<p></p>
<p><span style="font-family:monospace"><br>
&gt;&gt; <br>
&gt;&gt; Is it something that depends on environment, like ${IFS} in bash? <br>
&gt;&gt; Check, please. <br>
&gt;&gt; <br>
&gt;&gt;&gt; <br>
&gt;&gt;&gt; Obviously, kill would fail to send signals to processes, because it's <br>
&gt;&gt;&gt; now a single big number, which cannot be unambigously split back in <br>
&gt;&gt;&gt; general case. <br>
&gt;&gt;&gt; <br>
&gt;&gt;&gt; That's where awk comes in. We don't need to modify C part of tests to <br>
&gt;&gt;&gt; print newlines at end of file. We just order awk to print content of <br>
&gt;&gt;&gt; each file, which adds a newline at end - problem solved, kill can once <br>
&gt;&gt;&gt; again parse, which PIDs it get and send proper signals to them. Also, <br>
&gt;&gt;&gt; should be completely safe for zdtm.py, because it doesn't use Makefiles <br>
&gt;&gt;&gt; and sends signals on it's own. <br>
&gt;&gt;&gt; --- <br>
&gt;&gt;&gt; &nbsp;test/zdtm/static/Makefile &nbsp;&nbsp;&nbsp;&nbsp;| 4 &#43;&#43;-- <br>
&gt;&gt;&gt; &nbsp;test/zdtm/transition/Makefile | 4 &#43;&#43;-- <br>
&gt;&gt;&gt; &nbsp;2 files changed, 4 insertions(&#43;), 4 deletions(-) <br>
&gt;&gt;&gt; <br>
&gt;&gt;&gt; diff --git a/test/zdtm/static/Makefile b/test/zdtm/static/Makefile <br>
&gt;&gt;&gt; index af1254f5..8fe9d953 100644 <br>
&gt;&gt;&gt; --- a/test/zdtm/static/Makefile <br>
&gt;&gt;&gt; &#43;&#43;&#43; b/test/zdtm/static/Makefile <br>
&gt;&gt;&gt; @@ -338,7 &#43;338,7 @@ start: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$(PID) $(STATE) <br>
&gt;&gt;&gt; &nbsp;check_start: &nbsp;&nbsp;$(PID:%.pid=%.is_running) <br>
&gt;&gt;&gt; <br>
&gt;&gt;&gt; &nbsp;stop: &nbsp;$(STATE_OUT) <br>
&gt;&gt;&gt; - &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-kill -TERM `cat *.pid` <br>
&gt;&gt;&gt; &#43; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-kill -TERM `awk '{print}' *.pid` <br>
&gt;&gt;&gt; <br>
&gt;&gt;&gt; &nbsp;WAIT_TIME=240 <br>
&gt;&gt;&gt; &nbsp;%.stop: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%.pid % <br>
&gt;&gt;&gt; @@ -356,7 &#43;356,7 @@ WAIT_TIME=240 <br>
&gt;&gt;&gt; &nbsp;wait_stop: <br>
&gt;&gt;&gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i=0; &gt;&gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while [ $$i -lt $(WAIT_TIME) ] ; do &gt;&gt; - &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;kill -0 `cat *.pid 2&gt;/dev/null` 2&gt;<br>
/dev/null || break; &gt;&gt; &#43; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;kill -0 `awk '{print}' *.pid 2&gt;/dev/null` 2&gt;/dev/null || break; &gt;&gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sleep 1; &gt;&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i=`expr $$i &#43; 1`; &gt;&gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;done <br>
&gt;&gt;&gt; diff --git a/test/zdtm/transition/Makefile b/test/zdtm/transition/Makefile <br>
&gt;&gt;&gt; index 7ddb2384..dfc10ef5 100644 <br>
&gt;&gt;&gt; --- a/test/zdtm/transition/Makefile <br>
&gt;&gt;&gt; &#43;&#43;&#43; b/test/zdtm/transition/Makefile <br>
&gt;&gt;&gt; @@ -65,12 &#43;65,12 @@ start: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$(PID) <br>
&gt;&gt;&gt; &nbsp;check_start: &nbsp;&nbsp;$(PID:%.pid=%.is_running) <br>
&gt;&gt;&gt; <br>
&gt;&gt;&gt; &nbsp;stop: <br>
&gt;&gt;&gt; - &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-kill -TERM `cat *.pid` <br>
&gt;&gt;&gt; &#43; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-kill -TERM `awk '{print}' *.pid` <br>
&gt;&gt;&gt; <br>
&gt;&gt;&gt; &nbsp;WAIT_TIME=10 <br>
&gt;&gt;&gt; &nbsp;wait_stop: <br>
&gt;&gt;&gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-for i in `seq 1 $(WAIT_TIME)`; do &gt;&gt; - &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;kill -0 `cat *.pid 2&gt;/dev/null` 2&gt;/dev/null || break; &gt;&gt; &#43; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;kill -0 `awk '{print}' *.pid 2&gt;/dev/null` 2&gt;/dev/null || break; &gt;&gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sleep 1; &gt;&gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;done
<br>
&gt;&gt;&gt; <br>
&gt;&gt;&gt; -- <br>
&gt;&gt;&gt; 2.11.0 <br>
&gt;&gt;&gt; <br>
&gt;&gt;&gt; _______________________________________________ <br>
&gt;&gt;&gt; CRIU mailing list <br>
&gt;&gt;&gt; CRIU@openvz.org <br>
&gt;&gt;&gt; https://lists.openvz.org/mailman/listinfo/criu <br>
&gt; <br>
&gt;&gt; <br>
&gt;&gt; <br>
&gt;&gt; <br>
&gt;&gt; -- <br>
&gt;&gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Dmitry <br>
&gt; <br>
&gt; <br>
&gt; <br>
&gt;-- &nbsp;<br>
&gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Dmitry<br>
<br>
</span><br>
</p>
<div style="color: rgb(0, 0, 0);"></div>
</div>
</body>
</html>