如何使用Python向iTerm2会话中正在运行的进程发送SIGINT信号?
iTerm2 Python API发送SIGINT信号实现服务重启方案
iTerm2 Python API无需额外调用其他工具,直接使用你已掌握的async_send_text方法即可实现SIGINT信号发送,核心原理是终端下Ctrl+C触发SIGINT的本质是传输ASCII控制字符\x03,直接发送该字符即可终止会话前台运行的进程。
基础实现(适配90%以上场景)
完整的服务重启流程如下:
- 向目标会话发送
\x03终止前台运行的服务进程 - 添加短延时等待进程完全释放资源
- 发送重启命令加换行符
\n触发执行
示例代码:
import asyncio import iterm2 async def restart_service(session, restart_cmd): # 发送Ctrl+C对应控制字符,触发SIGINT await session.async_send_text("\x03") # 等待100ms,可根据服务实际退出速度调整 await asyncio.sleep(0.1) # 发送重启命令并执行 await session.async_send_text(f"{restart_cmd}\n") async def main(connection): # 替换为你自己的会话获取逻辑,以下为获取当前选中会话示例 app = await iterm2.async_get_app(connection) target_session = app.current_terminal_window.current_tab.current_session # 替换为对应服务的重启命令 await restart_service(target_session, "python3 app.py") if __name__ == "__main__": iterm2.run_until_complete(main)
特殊场景适配
如果服务运行在后台、或者会话内存在多进程的情况,可以通过获取会话前台进程PID,调用Python标准库发信号:
import os import signal # 获取当前会话的前台进程PID pid = await target_session.async_get_pid() # 发送SIGINT信号 os.kill(pid, signal.SIGINT)
需确保运行Python脚本的用户与进程所属用户一致,避免权限不足导致发送失败。
内容的提问来源于stack exchange,提问作者user6689821
相关产品推荐
相关产品推荐

