bash - 如何在完成执行后终止由 bash 脚本启动的后台进程/作业?

标签 bash ubuntu

所以我想启动一个 docker 镜像,然后是一个 Django 后端,最后是一个 Angular 前端,只要我需要进行测试/开发,就让它们运行,然后在我完成后杀死它们。为此,我首先尝试在脚本中启动它们并让它们在后台运行,然后让第二个脚本执行 kill %n对于这两个过程。这不起作用,因为后台进程位于另一个上下文中,因此第二个脚本无法引用它们。
然后我尝试了这个:

#!/bin/bash
# Exit Angular, Django and kill docker_img
function clean_up()
{
    echo "Exiting..."
    kill %2 
    kill %1 
    docker stop docker_img
    reset
    exit
}

# Trigger cleanup on CTRL + C
trap clean_up SIGINT

# Start docker database
docker start docker_img

# Start django backend
cd ~/Projects/DjangoBackend
source venv/bin/activate
python src/manage.py runserver &
sleep 3
echo 'Done starting django, starting angular'
sleep 1

# Start angular front end
cd ~/Projects/AngularFront
npm start &
但是,在 npm start & 之后运行时,陷阱停止工作,因此它实际上变得无用。我猜这可能是因为一旦我的脚本运行完毕,陷阱就不再事件了,但我不知道如何解决这个问题。我能做些什么?

最佳答案

如果你想在 unix/linux 中杀死一个进程,一种方法是你可以使用 ps -ef 命令将它们的 PID 记录在一个文件中。
然后使用 kill -9 杀死进程。
例子:

$ ps -ef | grep <process_name> | awk -F ' ' '{print $2}' > pid.txt
$ kill -9 `cat pid.txt`
  • ps -ef 命令会给出所有正在运行的进程,使用grep和进程名,可以得到特定进程的PID
  • awk 用于从上述命令
  • 中仅提取 PID
  • kill -9 将强制终止进程
  • 关于bash - 如何在完成执行后终止由 bash 脚本启动的后台进程/作业?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63960423/

    相关文章:

    linux - 通过将整数传递给尾部来修复尾部的无效行数

    php - E : Couldn't find any package by glob 'php-7.4'

    laravel - 从正在运行的项目的 Git 中提取更新

    python - 恢复已删除的 virtualenv

    bash - Colorized grep——查看整个文件并突出显示匹配项

    bash - Sendmail 不适用于 crontab (bash)

    git - 无法使用 crontab 运行 git 命令

    ubuntu - 当我打开一个新终端时,.bashrc 或 .bash_profile 似乎都没有执行

    linux - 批量更改旧日期的日期目录

    bash - 如何使用 Go 通过 SSH 发送终端转义序列?