擅长:python、mysql、java
<p>如果您有屏幕的进程ID(父进程,您可以使用<code>p.pid</code>访问,假设您使用了<code>p = Subprocess.Popen(...)</code>),那么您可以通过如下方式获得子进程ID</p>
<pre><code>ps ppid <SCREEN_PID> no-headers -o pid
</code></pre>
<p>在<a href="http://code.google.com/p/psutil/wiki/Documentation" rel="nofollow">psutil</a>模块中还有<code>psutil.Process(<SCREEN_PID>).get_children()</code>,这可能更适合解析ps的输出,因为(我认为)它直接解析<code>/proc</code>。在</p>
<p>Python的<a href="http://docs.python.org/2/library/os.html" rel="nofollow">standard os module</a>中还有一些函数允许您直接对进程id执行一些操作,但是不能获得父进程id或进程组id的子进程id</p>
<hr/>
<p>以下代码:</p>
^{pr2}$
<p>产生输出:</p>
<pre>
./screen-pid.py
Creating screen session named: minecraft-server-K77d1
Screen PID: 2274
Child PIDs: [2276]
</pre>
<p>您可以使用<code>cpids[0]</code>从子pid列表访问子pid。在</p>
<p>该脚本只需生成具有特定名称的屏幕进程,然后查找父进程id,并从中找到子进程id。在</p>
<p>如果您正在使用同一个脚本运行多个实例,则会在屏幕名称后面附加随机字符。如果你没有,你可以删除所有这些,但是离开它没有任何区别。在</p>
<p>查找父进程id的方法(解析<code>screen -ls</code>的输出)可能不是最好的方法,您可以选择使用<code>psutils.process_iter()</code>遍历这些进程。但这似乎有效。在</p>