【问题标题】:Kill background processes in Linux在 Linux 中杀死后台进程
【发布时间】:2016-08-07 15:30:10
【问题描述】:

我正在尝试为我的项目构建一个启动脚本和一个停止脚本。我需要运行一个 sass 自动编译器和一个服务器,并将两者的输出重定向到一个文件。我为此使用lite-serversass --watch

为了使这些进程同时运行,我使用& 将这些进程置于后台。这带来了停止脚本的挑战,我无法像往常一样使用Ctrl+C 停止脚本。我想我可以通过将进程 ID 存储在文本文件中来克服这个问题。

我想出了以下“启动”脚本:

# Start a sass watcher and a server running simultaneously. Store the PIDs in a
# text file so that the processes can be easily stopped.

(
  lite-server &
  echo $! > .pids.txt &
  sass --watch sass:css --style=compressed &
  echo $! >> .pids.txt &
) &> log.txt
cat .pids.txt

然后,为了停止进程,我正在使用

kill $(cat .pids.txt)

将进程 ID 写入文本文件似乎有点骇人听闻。有没有更好的方法来完成我想做的事情?

【问题讨论】:

  • 在不将 PID 写入文本文件的情况下,如果这些进程在您的机器上只能运行一次(一个实例),您可以使用 killall 命令。 killall -s KILL lite-server sass(单独或组合)
  • 好的,很酷。我认为这不是最佳做法,但这是有道理的。

标签: linux bash concurrency process kill-process


【解决方案1】:

我可能更喜欢 grep 进程并终止进程,而不是将 PID 保存在文件中。

ps -ef | grep lite-server | awk '{print $2}' | kill -9

我假设ps -ef 输出中的第二列是您服务器中进程lite-server 的PID。

【讨论】:

  • 我将尝试使用xargs 修复您的解决方案:bash ps -ef | grep lite-server | awk '{print $2}' | xargs kill -9
【解决方案2】:

你应该添加你想要什么样的“杀戮”.. 如:kill -9 $(cat .pids.txt)

【讨论】:

    【解决方案3】:

    您可以将它们存储在一个数组中,如果这不是您所说的 hackish。

    编辑: 另一种方法是直接执行:

    kill $(jobs -p)
    

    这会杀死所有后台进程(jobs -p 将所有后台进程的 PID 打印到 stdout,然后交给 kill)。

    【讨论】:

    • 我是一个对 bash 几乎一无所知的人,你能举个例子吗?
    • 可悲的是,我也是一个对 bash 几乎一无所知的人,我只知道可以在 bash 中使用数组,但我自己从来没有这样做过。数组上的 bash 引用 (gnu.org/software/bash/manual/bash.html#Arrays) 似乎表明,数组的使用非常容易。您可以只引入一个索引变量并在每次将某些内容存储在数组中时递增它:`((i++));回声$! > array[i] 要杀死数组中具有 id 的所有进程,您可以使用一个 for 循环,将 i 递减直到它再次为零,并在找到的每个 pid 上发出 kill。请注意,我没有测试该代码。
    • 好的。谢谢。我去看看
    猜你喜欢
    • 2015-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-15
    • 2021-11-22
    • 1970-01-01
    • 2012-09-30
    相关资源
    最近更新 更多