【问题标题】:Killing a process within a python script running on linux在 linux 上运行的 python 脚本中杀死一个进程
【发布时间】:2016-07-23 08:07:01
【问题描述】:

我有 Raspbian 作为在我的 RPI 上运行的 linux 发行版。我已经使用 twisted 设置了一个小型套接字服务器,它从 iOS 应用程序接收某些命令。这些命令是字符串。当我收到“st”时我开始了一个进程,现在我想在收到“sp”时杀死它。这是我尝试过的方式:

  1. 进口操作系统
  2. 使用 os.system("...") //启动进程
  3. os.system("...") // 杀死进程

假设服务名为 xyz。 这是我试图杀死它的确切方式:

os.system('ps axf | grep xyz | grep -v grep | awk '{print "kill " $1 }' | sh')

但是我遇到了语法错误。当我在终端单独尝试时,该行运行完美。这是在 python 脚本中执行此操作的错误方法吗?我该如何解决?

【问题讨论】:

    标签: python linux bash shell awk


    【解决方案1】:

    您需要转义字符串中的引号:

    os.system('ps axf | grep xyz | grep -v grep | awk \'{print "kill " $1 }\' | sh')
    

    或者使用三引号:

    os.system('''ps axf | grep xyz | grep -v grep | awk '{print "kill " $1 }' | sh''')
    

    【讨论】:

    • 管道是 shell 编程反模式的一个抓包。您想要pkill 或至少需要正确编写的重新实现。另请参阅useless use of grep
    【解决方案2】:

    或者,使用Popen(...).pid 打开进程,然后使用os.kill()

    my_pid = Popen('/home/rolf/test1.sh',).pid
    os.kill(int(my_pid), signal.SIGKILL)
    

    记得在你的脚本中包含一个 shebang (#!/bin/sh)

    编辑: 再想想,也许

    os.kill(int(my_pid), signal.SIGTERM)
    

    可能是结束进程的更好方法,它至少让进程有机会优雅地关闭。

    【讨论】:

    • 你为什么要管道标准输出和标准错误?为什么self
    • @CristianCiupitu 已修复!
    猜你喜欢
    • 2012-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-28
    • 2012-04-07
    • 2016-03-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多