我正在开发一个启动多个进程和数据库连接的python脚本.我偶尔想用Ctrl+ C信号杀死脚本,我想做一些清理工作.
在Perl我会这样做:
$SIG{'INT'} = 'exit_gracefully';
sub exit_gracefully {
print "Caught ^C \n";
exit (0);
}
Run Code Online (Sandbox Code Playgroud)
我如何在Python中模拟这个?
我已经(过去)编写跨平台(Windows/Unix的),其命令行启动时,处理用户输入的应用Ctrl- C以同样的方式组合(即彻底结束应用程序).
在Windows上是否可以从另一个(不相关的)进程发送Ctrl- C/ SIGINT /等效进程来请求它干净地终止(给它一个整理资源的机会等)?
我想知道Heroku服务器状态,无法找到有关此主题的任何文档.
例:
Process exited with status 143
Run Code Online (Sandbox Code Playgroud)
谁能解释一下这个例子?我在哪里可以找到资源以供将来参考?
我需要使用ctrl c从time.sleep()中断.
While 1:
time.sleep(60)
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,当控件进入time.sleep函数时,需要经过整整60秒才能处理CTRL C
有没有优雅的方式来做到这一点.这样我即使在控制时间内也可以中断.睡眠功能
编辑
我在一个遗留实现上测试它,在Windows 2000上使用python 2.2导致了所有的麻烦.如果我使用了更高版本的python CTRL C会中断sleep().我通过在for循环中调用sleep(1)来快速破解.这暂时解决了我的问题
Linux支持使用-Command 将任意Posix-Signal发送到进程SIGINT或SIGTERM发送到进程kill.虽然SIGINT并且SIGTERM只是无聊的方式以友好或不那么友好的方式结束流程,但SIGQUIT意味着触发核心转储.这可以用来触发正在运行的Java VM打印出一个线程转储,包括所有正在运行的线程的堆栈跟踪 - 整洁!打印完调试信息后,Java VM将继续执行以前的操作; 事实上,线程转储只发生在另一个具有最高优先级的衍生线程中.(您可以通过使用自己尝试kill -3 <VM-PID>.)
请注意,您也可以使用(不支持的!)Signal和-package中的SignalHandler类注册自己的信号处理程序sun.misc,这样您就可以获得各种乐趣.
但是,我还没有找到一种向Windows进程发送信号的方法.信号由某些用户输入创建:例如,在两个平台上Ctrl-C触发a SIGINT.但是,在Windows上手动将信号发送到正在运行但非交互式的进程似乎没有任何实用性.显而易见的解决方案是使用Cygwin kill可执行文件,但是虽然它可以使用适当的Windows API结束Windows进程,但我无法使用它发送SIGBREAK(Windows等效SIGQUIT); 事实上,我认为它能够发送到Windows进程的唯一信号是SIGTERM.
因此,长话短说并重复标题:如何向Windows中的进程发送任意信号?
当我的Selenium程序由于某些错误而崩溃时,它似乎留着正在运行的进程。
例如,这是我的流程列表:
carol 30186 0.0 0.0 103576 7196 pts/11 Sl 00:45 0:00 /home/carol/test/chromedriver --port=51789
carol 30322 0.0 0.0 102552 7160 pts/11 Sl 00:45 0:00 /home/carol/test/chromedriver --port=33409
carol 30543 0.0 0.0 102552 7104 pts/11 Sl 00:48 0:00 /home/carol/test/chromedriver --port=42567
carol 30698 0.0 0.0 102552 7236 pts/11 Sl 00:50 0:00 /home/carol/test/chromedriver --port=46590
carol 30938 0.0 0.0 102552 7496 pts/11 Sl 00:55 0:00 /home/carol/test/chromedriver --port=51930
carol 31546 0.0 0.0 102552 7376 pts/11 Sl 01:16 0:00 /home/carol/test/chromedriver --port=53077
carol 31549 0.5 0.0 0 0 …Run Code Online (Sandbox Code Playgroud) python selenium python-2.7 selenium-chromedriver selenium-webdriver
我正在编写一个我将使用主管运行的 python 程序。该程序主要执行以下操作:
if __name__ == "__main__":
while True:
run()
Run Code Online (Sandbox Code Playgroud)
其中 run 函数执行一个简单的任务,即从数据库 ( mysqlDB)中获取某些内容并将其发送到电子邮件中。
我想编写程序,以便当我使用
supervisorctl stop program
mysql 连接应该关闭,并完成一个适当的关闭日志。
有什么办法可以在我的 python 脚本中处理停止命令。
为了更深入地了解Docker,我创建了一个执行python脚本的dockerfile。它工作正常,但是在执行脚本后容器崩溃了。我如何修改我的dockerfile以便在执行后销毁容器,而不是让容器始终崩溃并重新启动?
Dockerfile:
FROM python:3
ADD aa.py /
CMD [ "python", "./aa.py" ]
Run Code Online (Sandbox Code Playgroud)
蟒蛇:
print('Hello!')
Run Code Online (Sandbox Code Playgroud)
错误信息:
2017-06-14 11:37:09 [CELL/0] OUT Starting health monitoring of container
2017-06-14 11:37:09 [APP/PROC/WEB/0] OUT Hello!
2017-06-14 11:37:09 [APP/PROC/WEB/0] OUT Exit status 0
2017-06-14 11:37:09 [CELL/0] OUT Exit status 143
2017-06-14 11:37:09 [CELL/0] OUT Destroying container
2017-06-14 11:37:09 [API/0] OUT Process has crashed with type: "web"
2017-06-14 11:37:09 [API/0] OUT App instance exited with guid 6fdede46-6751-4725-ad78-b76262dbe701 payload: {"instance"=>"", "index"=>0, "reason"=>"CRASHED", "exit_description"=>"2 error(s) occurred:\n\n* 2 error(s) occurred:\n\n* Codependent …Run Code Online (Sandbox Code Playgroud) 我想尝试在 try 块中捕获 PyCharm 的停止信号(当按下停止时),但我无法弄清楚这个信号是什么或如何在代码中捕获它。JetBrains 并未在其文档中提供对此的深入了解。
我尝试过捕获它,BaseException但它似乎根本不是例外。
这是可以通过编程捕获的吗?
我有一个作为服务运行的Python脚本.它写入磁盘.如果用户在服务上调用systemctl stop,我想以自己的方式处理该命令以降低文件损坏的风险.
如何捕获systemctl stop命令?
我在/ usr/lib/systemd/system中的文件是:
[Unit]
Description=foo
[Service]
Type=simple
ExecStart=/usr/bin/python /srv/go.py
User=jon
Restart=always
[Install]
WantedBy=graphical.target
Run Code Online (Sandbox Code Playgroud)
我的Python脚本是:
#!/usr/bin/python
import time
import datetime
import threading
def worker():
while True:
with open('/tmp/go.txt', 'a') as f:
s = str(datetime.datetime.utcnow()) + '\n'
f.write(s)
print(s)
time.sleep(1)
if __name__=='__main__':
t = threading.Thread(target=worker)
t.start()
Run Code Online (Sandbox Code Playgroud) 我对在 Python 中运行时停止程序不感兴趣,当然,控制 c 可以做到这一点。我感兴趣的是以下情况:假设您有一个运行 5 小时的程序。您让它运行了两个小时,然后决定到目前为止您所做的事情值得保存,但您仍然不想继续。那么保存数据和退出程序的最佳方法是什么?到现在为止,我所做的是在泡菜中存储一个布尔值,然后在每个循环中打开泡菜并检查其值。如果布尔值为真,则程序继续运行,如果为假,则程序停止并保存数据并退出。我可以使用不同的程序更改布尔值。然而,即使泡菜只由一个布尔值组成,它仍然会严重减慢程序的速度,可能多达 10 倍,因为泡菜需要很长时间才能打开。我考虑过其他解决方案,我知道 pdb_trace() 工具,但我真的不知道在这种情况下如何使用它。我在想也许设置环境变量可能会有所帮助,但我不太擅长设置环境变量。任何建议,将不胜感激。
python ×8
signals ×2
windows ×2
controls ×1
debugging ×1
deployment ×1
docker ×1
docker-image ×1
dockerfile ×1
exception ×1
heroku ×1
java ×1
linux ×1
pycharm ×1
python-2.7 ×1
selenium ×1
server-side ×1
sigint ×1
supervisord ×1
systemd ×1
utilities ×1