【问题标题】:Kill a "background process" in Linux using a C Program使用 C 程序杀死 Linux 中的“后台进程”
【发布时间】:2014-07-01 12:29:59
【问题描述】:

我已经在后台启动了我的进程,我想使用一个 C 程序使用 popen() 来终止该进程。

我尝试了很多方法,但都是徒劳的。原因是当我运行 C 代码时,它在子 shell 中执行,因此我无法让进程在主 shell 中运行。

我用 $!获取最新的pid在后台运行,但由于上述原因它不起作用。

【问题讨论】:

  • 可以显示你的脚本吗?后台进程是否从脚本运行?

标签: linux shell process background


【解决方案1】:
my_process & pids="${pids-} $!" //start my process
sleep 10                       // run for 10 seconds
kill -2 $pids                  //kill the process

您也可以将 PID 存储在文件中并杀死它。就像

./process1.sh &
echo $! > /tmp/process1.pid

kill -9 `cat /tmp/process*.pid`
rm /tmp/process*.pid

【讨论】:

  • 感谢您的回答,但恐怕我必须在不将其重定向到临时文件的情况下做出解决方案另外,请您详细说明“my_process & pids="${pids- } $!""
  • @Sobhan ${pids-} 语法是为了避免在使用set -o nounset 时出错。
  • 不幸的是,现在排除了从 shell 脚本中杀死后台进程的可能性。我必须通过使用'popen'或'system()'从C执行unix命令来杀死它。由于从 C 中运行 unix 命令将再次在子 shell 中运行,您能否设法实现这一目标..
  • @Sobhan 是的,无法使用systempopen 命令杀死进程,但您可以这样做。见herehere
  • 您给出的第一个链接会在 C 本身中启动后台进程并在那里杀死它。但是,在我的情况下,bg 进程从邮件外壳开始,我必须在子外壳(C 程序)中杀死它。因此,如果有任何方法可以终止此类进程,请在此处发布..
【解决方案2】:

您应该将您的流程设置为daemon,这样您就可以开始、结束和重新启动它而不会出现复杂情况。

您可以从这里开始:Best way to make a shell script daemon?

【讨论】:

    【解决方案3】:

    +1 对 Raydel 的回答

    另一种选择(因为有很多方法可以做事)如果您有 root,您还可以将其创建为服务,然后使用“服务”命令手动启动和停止它。

    (抱歉想添加作为对 Raydel 的评论,但我的代表显然不够高,因此添加为单独的答案)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多