- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我很少在论坛上发帖提问,但这个问题让我很困惑。我很好奇是什么原因造成的(一个解决方案也很好,但大多数情况下,我想知道为什么我会遇到这个问题):
我最近写了一个 python 脚本来包装由 PBS 作业启动的远程命令的调用:
#! /usr/bin/env python
#
# Copyright (c) 2009 Maciej Brodowicz
# Copyright (c) 2011 Bryce Lelbach
#
# Distributed under the Boost Software License, Version 1.0. (See accompanying
# file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
from datetime import datetime
from string import letters, digits
from types import StringType
from optparse import OptionParser
from threading import Thread
# subprocess instantiation wrapper. Unfortunately older Python still lurks on
# some machines.
try:
from subprocess import Popen, STDOUT, PIPE
from types import StringType
class process:
_proc = None
_exec = None
def __init__(self, cmd):
self._proc = Popen(cmd, stderr = STDOUT, stdout = PIPE,
shell = (False, True)[type(cmd) == StringType])
def poll(self):
return self._proc.poll()
def pid(self):
return self._proc.pid
def _call(self):
# annoyingly, KeyboardInterrupts are transported to threads, while most
# other Exceptions aren't in python
try:
self._proc.wait()
except Exception, err:
self._exec = err
def wait(self, timeout=None):
if timeout is not None:
thread = Thread(target=self._call)
thread.start()
# wait for the thread and invoked process to finish
thread.join(timeout)
# be forceful
if thread.is_alive():
self._proc.terminate()
thread.join()
# if an exception happened, re-raise it here in the master thread
if self._exec is not None:
raise self._exec
return (True, self._proc.returncode)
if self._exec is not None:
raise self._exec
return (False, self._proc.returncode)
else:
return (False, self._proc.wait())
def read(self):
return self._proc.stdout.read()
except ImportError, err:
# no "subprocess"; use older popen module
from popen2 import Popen4
from signal import SIGKILL
from os import kill, waitpid, WNOHANG
class process:
_proc = None
def __init__(self, cmd):
self._proc = Popen4(cmd)
def poll(self):
return self._proc.poll()
def pid(self):
return self._proc.pid
def _call(self):
# annoyingly, KeyboardInterrupts are transported to threads, while most
# other Exceptions aren't in python
try:
self._proc.wait()
except Exception, err:
self._exec = err
def wait(self, timeout=None):
if timeout is not None:
thread = Thread(target=self._call)
thread.start()
# wait for the thread and invoked process to finish
thread.join(timeout)
# be forceful
if thread.is_alive():
kill(self._proc.pid, SIGKILL)
waitpid(-1, WNOHANG)
thread.join()
# if an exception happened, re-raise it here in the master thread
if self._exec is not None:
raise self._exec
return (True, self._proc.wait())
if self._exec is not None:
raise self._exec
return (False, self._proc.wait())
else:
return (False, self._proc.wait())
def read(self):
return self._proc.fromchild.read()
def run(cmd, timeout=3600):
start = datetime.now()
proc = process(cmd)
(timed_out, returncode) = proc.wait(timeout)
now = datetime.now()
output = ''
while True:
s = proc.read()
if s:
output += s
else:
break
return (returncode, output, timed_out)
def rstrip_last(s, chars):
if s[-1] in chars:
return s[:-1]
else:
return s
# {{{ main
usage = "usage: %prog [options]"
parser = OptionParser(usage=usage)
parser.add_option("--timeout",
action="store", type="int",
dest="timeout", default=3600,
help="Program timeout (seconds)")
parser.add_option("--program",
action="store", type="string",
dest="program",
help="Program to invoke")
(options, cmd) = parser.parse_args()
if None == options.program:
print "No program specified"
exit(1)
(returncode, output, timed_out) = run(options.program, options.timeout)
if not 0 == len(output):
print rstrip_last(output, '\n')
if timed_out:
print "Program timed out"
exit(returncode)
# }}}
另一个 python 脚本根据 PBS 报告的可用资源将命令行参数放在一起,类似于 mpirun。我使用 python-paramiko 通过 SSH 启动远程命令。最初我只是直接执行命令,但是当其中一个远程运行的进程以信号(例如 SIGSEGV)退出时,我没有收到正确的退出代码。因此,需要上面的脚本。
在我工作的开发集群上运行这个脚本时,我注意到这个脚本在我的 4 核 Debian GNU/Linux 节点上无法正常工作,但它在我的 48 核 RHEL/Linux 节点上运行:
在 Debian 节点上:
wash@hermione0:~/sandbox$ python --version
Python 2.6.7
wash@hermione0:~/sandbox$ uname -a
Linux hermione0 2.6.32-5-amd64 #1 SMP Wed Jan 12 03:40:32 UTC 2011 x86_64 GNU/Linux
wash@hermione0:~/sandbox$ time ./hpx_invoke.py --program='sleep 30' --timeout=5
Program timed out
real 0m30.025s
user 0m0.016s
sys 0m0.012s
wash@hermione0:~/sandbox$
在 RHEL 节点上:
[22:08:23]:wash@vega:/home/wash/sandbox$ python --version
Python 2.6.6
[22:09:28]:wash@vega:/home/wash/sandbox$ uname -a
Linux vega 2.6.32-131.4.1.el6.x86_64 #1 SMP Fri Jun 10 10:54:26 EDT 2011 x86_64 x86_64 x86_64 GNU/Linux
[22:09:30]:wash@vega:/home/wash/sandbox$ time ./hpx_invoke.py --program='sleep 30' --timeout=5
Program timed out
real 0m5.053s
user 0m0.040s
sys 0m0.020s
[22:09:41]:wash@vega:/home/wash/sandbox$
这可能是什么原因造成的?
附言我是这些机器的系统管理员。
最佳答案
我猜想可用包的不同会导致“子进程实例化包装器”的不同分支在两台机器上使用。在一个分支中,您将使用 SIGTERM(terminate()
调用),而在另一个分支中,您将使用 SIGKILL。
话虽如此,sleep
似乎在给定任一信号的情况下过早结束。可能还有其他差异,但很难说。您最好输入一些调试代码,看看在什么机器上会发生什么。
关于python - RHEL 和 Debian 上 Python 脚本的不同行为,几乎相同的 Python 版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6529598/
在Debian的最新稳定版本中似乎没有/etc/rc.local Debian Stretch 。它在哪里? /etc/rc.local已过时吗? 最佳答案 rc.local已弃用。 看来您仍然可以拥
尝试从未签名的存储库将 Debian 软件包安装到 Debian 9: # apt-get --allow-unauthenticated update Get:1 http://files.free
我尝试打开 5431 端口,这样输入: sudo iptables -A INPUT -p tcp --dport 5431 --jump ACCEPT iptables-save 当我在链 ipta
我正在尝试为我的应用程序构建一个预编译的 debian 包。我的包中存在一些二进制文件(编译模块)。现在,我收到有关将二进制文件添加到 debian/source/include-binaries 的
Debian 站点很棒 http://www.debian.org/distrib/packages ,我知道搜索工具,但我真的想要一个完整的包/文件/架构目录,采用某种可使用的格式 - xml、js
Debian 如何管理软件包名称的冲突?例如,当不同的存储库中有许多同名的包时。 最佳答案 当有很多同名的包时,APT 怎么知道它们是不同的呢? 不能。所以它会安装版本号最高的版本。 关于debian
我正在构建一个 Debian 软件包,它通过将许多其他紧密相关的软件包声明为依赖项来收集它们。我希望这些依赖项与包的版本完全相同。 Debian 构建系统中有没有办法避免在控制文件中硬编码(除了自己预
我有一个持续集成服务器构建一些软件,这些软件依赖于比 debian squeeze 中提供的 apt 包更新的 libqt4-dev 版本。该版本在 debian wheezy 中可用。我如何告诉 a
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
我在 debian 上安装了一个带有 xfce4 的新系统。我的问题是如何让 xfce 在启动时运行?现在我只能用 exec ck-launch-session startxfce4 运行它。 谢谢
我听说我可以使用 apt-get install libc6 来完成此操作,但我需要向/etc/apt/sources.list 添加一些内容才能接收最新的 glibc 版本。 我应该做什么? 最佳答
嗨,我正在尝试在运行 rasbian wheezy 的树莓派上安装 geos,以便我可以在我的 python 脚本中包含 shapely 模块。我尝试使用: git clone git://git.d
您好,我正在尝试在运行 rasbian wheezy 的树莓派上安装 geos,这样我就可以在我的 python 脚本中包含 shapely 模块。我尝试使用:git clone git://git.
我正在尝试在 Debian 8.5.0 上安装 GitLab。我关注installation guide但最后一步失败了,我在文档中找不到任何信息。 gitlab-ctl 重新配置完成 Running
我已经安装了 jetty 9,但我无法将它作为服务启动/停止。 从命令行运行有效。 root@backend:/opt/jetty# service jetty start Job for jetty
我正在寻找一种快速方法来验证 debian/control我的项目文件在将它们发送到构建服务器之前在语法上是有效的。 (即等效于 apache2ctl configtest 但对于 debian 控制
[相关部分] 我的 bitbucket-pipeline 看起来像这样: - step: image: python:3.5.1 name: upload to s3
当我下载一些包源时,(例如foo-[ver].orig.tar.gz、foo-[ver].dsc),我在使用dpkg-source -x foo-[ver].dsc时经常遇到依赖问题。和 dpkg-b
我有一台旧的专用服务器,想将其升级到最新的操作系统版本。 我正在寻找从 升级的最佳方式Debian 6 Squeeze => Debian 8.6 杰西 . 最佳答案 首先,请记住,从一个 Debia
我正在尝试使用 Cpack 构建一个正确命名的 Debian 包。我的 CMakeLists.txt 中有以下内容: set(CPACK_PACKAGE_NAME "something") set(C
我是一名优秀的程序员,十分优秀!