当程序收到kill信号时,你如何处理清理?
例如,我连接的应用程序需要任何第三方应用程序(我的应用程序)finish
在注销时发送命令.finish
当我的应用程序被摧毁时,发送该命令的最佳发音是kill -9
什么?
编辑1:无法捕获kill -9.谢谢你们纠正我.
编辑2:我想这种情况是当一个人调用kill时与ctrl-c相同
我要求在接收任何终止命令(如SIGTERM和SIGKILL)时写入日志文件.
我可以注册SIGTERM但是如何处理SIGKILL信号?
我有一个程序产生并与CPU重,不稳定的进程通信,而不是由我创建.如果我的应用程序崩溃或被杀死SIGKILL
,我希望子进程也被杀死,因此用户不必跟踪它们并手动终止它们.
我知道之前已经讨论过这个主题,但是我已经尝试了所描述的所有方法,并且它们似乎都没有在测试中幸存下来.
我知道它一定是可能的,因为终端一直都在做.如果我在终端中运行某些东西并杀死终端,这些东西总会死掉.
我试过atexit
,双叉和ptys
.atexit
不起作用sigkill
; 双叉根本不起作用; 和ptys
我没有发现任何方式使用Python来工作.
今天,我发现了这一点prctl(PR_SET_PDEATHSIG, SIGKILL)
,这应该是儿童进程在父母去世时命令自杀的一种方式.我尝试使用它popen
,但它接缝完全没有效果:
import ctypes, subprocess
libc = ctypes.CDLL('/lib/libc.so.6')
PR_SET_PDEATHSIG = 1; TERM = 15
implant_bomb = lambda: libc.prctl(PR_SET_PDEATHSIG, TERM)
subprocess.Popen(['gnuchess'], preexec_fn=implant_bomb)
Run Code Online (Sandbox Code Playgroud)
在上面,创建了子节点并且父节点退出.现在你会期望gnuchess
得到一个SIGKILL
和死,但它没有.我仍然可以在我的流程管理器中使用100%CPU找到它.
任何人都可以告诉我,我的使用是否有问题prctl
?或者您是否知道终端如何设法杀死他们的孩子?
我在iPhone模拟器中构建并运行一个项目.我按下主页按钮将其发送到后台.然后我双击主页按钮在后台找到我的应用程序并点按它.它变得活跃,应用程序继续运行.无论我重复多少次,我都没有问题.然后我通过点击应用程序图标上的小红色减号来终止该过程.但如果我再次点击应用程序图标重新启动它,我会收到SIGKILL错误并且应用程序崩溃.这可能是什么原因?它可能是由我的XCode偏好引起的吗?
当我双击主页按钮并从多任务栏退出我的应用程序并再次打开应用程序时,Xcode读取:"线程1:程序收到信号:SIGKILL"并冻结我的iPod.该应用程序有1500多行,所以我无法真正放任何代码,抱歉.我能做错什么?
我只是用一个睡眠过程来测试kill switch标志.
首先,我尝试用-15杀死它
xtechkid@ubuntu:~/Desktop/expermiments$ ps cax | grep 10005
10005 pts/2 S+ 0:00 sh
xtechkid@ubuntu:~/Desktop/expermiments$ kill -15 10005
Run Code Online (Sandbox Code Playgroud)
这个过程终止了
xtechkid@ubuntu:~/Desktop/expermiments$ sh testscript.sh
This is a script which sleeps for few seconds ..
Terminated
Run Code Online (Sandbox Code Playgroud)
然后我用 - 9杀了它
xtechkid@ubuntu:~/Desktop/expermiments$ ps -ef | grep testscript.sh
xtechkid 10059 9852 0 13:48 pts/2 00:00:00 sh testscript.sh
xtechkid 10064 10007 0 13:48 pts/4 00:00:00 grep --color=auto testscript.sh
xtechkid@ubuntu:~/Desktop/expermiments$ kill -9 10059
Run Code Online (Sandbox Code Playgroud)
这个过程被杀了
xtechkid@ubuntu:~/Desktop/expermiments$ sh testscript.sh
This is a script which sleeps for few seconds ..
Killed …
Run Code Online (Sandbox Code Playgroud) 我在 Cloud Composer v1.16.16 上运行 Airflowv1.10.15。
我的 DAG 看起来像这样:
from datetime import datetime, timedelta
# imports
from airflow import DAG
from airflow.operators.python_operator import PythonOperator
from airflow.operators.dummy_operator import DummyOperator
from scripts import workday_extract, workday_config_large
default_args = {
'owner': 'xxxx',
'depends_on_past': False,
'start_date': datetime(2021, 9, 14),
'email_on_failure': True,
'email': ['xxxx'],
'retries': 1,
'retry_delay': timedelta(minutes=2),
'catchup': False
}
# Define the DAG with parameters
dag = DAG(
dag_id='xxxx_v1',
schedule_interval='0 20 * * *',
default_args=default_args,
catchup=False,
max_active_runs=1,
concurrency=1
)
def wd_to_bq(key, val, **kwargs):
logger.info("workday …
Run Code Online (Sandbox Code Playgroud) sigkill python-3.x google-cloud-platform airflow google-cloud-composer
很少,我们的应用程序崩溃,因为它收到SIGKILL.情况不同,但回溯总是一样的:
#0 0x94a00afa in mach_msg_trap ()
#1 0x94a01267 in mach_msg ()
#2 0x00fa9d5c in _UIPasteboardServerContainsTypesAtIndex ()
#3 0x00faa9ae in UIPasteboardServerContainsTypesAtIndex ()
#4 0x00fa5417 in -[UIPasteboard containsPasteboardTypes:] ()
#5 0x00de4054 in -[UITextField canPerformAction:withSender:] ()
#6 0x087038a8 in -[UIResponder(UITextAccessibilityUtilities) _accessibilityHasTextOperations] ()
#7 0x08704df5 in -[UIAccessibilityTextFieldElement _accessibilityHasTextOperations] ()
#8 0x08791dcf in -[NSObject(AXPrivCategory) accessibilityAttributeValue:] ()
#9 0x0878a3b4 in _copyMultipleAttributeValuesCallback ()
#10 0x087c5c95 in _AXXMIGCopyMultipleAttributeValues ()
#11 0x087c0a6c in _XCopyMultipleAttributeValues ()
#12 0x087c8e66 in mshMIGPerform ()
#13 0x020cf1c5 in __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ ()
#14 0x02034022 in __CFRunLoopDoSource1 …
Run Code Online (Sandbox Code Playgroud) 我正在用 Python 编写一个监控服务来监控另一个服务,虽然监控和调度部分工作正常,但我很难弄清楚如何使用发送SIGINT
到 Docker 容器的信号来正确关闭该服务。具体来说,该服务应该从 docker stop 或 Kubernetes stop 信号捕获SIGINT
,但到目前为止还没有。我已将问题简化为最小的测试用例,很容易在 Docker 中复制:
import signal
import sys
import time
class MainApp:
def __init__(self):
self.shutdown = False
signal.signal(signal.SIGINT, self.exit_gracefully)
signal.signal(signal.SIGTERM, self.exit_gracefully)
def exit_gracefully(self, signum, frame):
print('Received:', signum)
self.shutdown = True
def start(self):
print("Start app")
def run(self):
print("Running app")
time.sleep(1)
def stop(self):
print("Stop app")
if __name__ == '__main__':
app = MainApp()
app.start()
# This boolean flag should flip to false when a SIGINT or SIGTERM comes in...
while …
Run Code Online (Sandbox Code Playgroud) 我编写了一个测试脚本,它运行另一个脚本来启动服务器测试.测试完成后SIGKILL
,会向服务器进程发送一条消息,但是当再次运行测试脚本时,服务器会抛出一个EADDRINUSE
错误(我在node.js环境中),这意味着服务器正在尝试挂载的端口当前正在使用.我们试图用a杀死的进程SIGKILL
仍然在运行.我不认为这是一个特定于节点的问题,而是因为我对bash流程如何工作缺乏教育.
以下是一些细节,这是我的开始脚本scripts/start-node.sh
:
#!/bin/bash
node_modules/.bin/babel-node --stage 0 index.js
Run Code Online (Sandbox Code Playgroud)
这是我的节点服务器调用index.js
(我没有创建任何process
事件监听器):
Http.createServer(…).listen(PORT, () => console.log(`Server listening on ${PORT}`))
Run Code Online (Sandbox Code Playgroud)
并且启动脚本由节点child_process
模块控制:
var child = child_process.spawn('scripts/start-node.sh')
// Later…
child.kill('SIGKILL')
Run Code Online (Sandbox Code Playgroud) sigkill ×10
iphone ×3
objective-c ×2
python ×2
signals ×2
airflow ×1
bash ×1
docker ×1
exception ×1
ios ×1
ipad ×1
java ×1
kill-process ×1
linux ×1
node.js ×1
process ×1
python-3.x ×1
sigint ×1
subprocess ×1
unix ×1