杀死在 nix-shell 中启动的后台进程

dmv*_*nna 4 trap background-process nix

我正在使用工具和数据库开发一个简单的数据科学环境。Python当我输入时nix-shell,我启动数据库进程。我想在退出环境时将其降速。

我该如何使用trap并nix实现这一目标?

iva*_*van 6

我一直在使用类似以下的东西:

./shell.nix:

let
  pkgs = import <nixpkgs> { };

in with pkgs; mkShell {
  buildInputs = [ glibcLocales postgresql ];

  shellHook = ''
    export LANG=en_US.UTF-8
           PGDATABASE=some-dbname \
           PGDATA="$PWD/nix/pgdata" \
           PGHOST="$PWD/nix/sockets" \
           PGPORT="5433" \
           PGUSER="$USER"

    trap "'$PWD/nix/client' remove" EXIT
    nix/client add
  '';
}
Run Code Online (Sandbox Code Playgroud)

./nix/客户端

#! /usr/bin/env bash

set -eu

client_pid=$PPID

start_postgres() {
    if postgres_is_stopped
    then
        logfile="$PWD/log/pg.log"
        mkdir -p "$PGHOST" "${logfile%/*}"
        (set -m
        pg_ctl start --silent -w --log "$logfile" -o "-k $PGHOST -h ''")
    fi
}

postgres_is_stopped() {
    pg_ctl status >/dev/null
    (( $? == 3 ))
}

case "$1" in
    add)
        mkdir -p nix/pids touch nix/pids/$client_pid
        if [ -d "$PGDATA" ]
        then
            start_postgres
        else
            pg_ctl initdb --silent -o '--auth=trust' && start_postgres && createdb $PGDATABASE
        fi
        ;;
    remove)
        rm nix/pids/$client_pid
        if [ -n "$(find nix/pids -prune -empty)" ]
        then
            pg_ctl stop --silent -W
        fi
        ;;
    *)
        echo "Usage: ${BASH_SOURCE[0]##*/} {add | remove}"
        exit 1
        ;;
esac
Run Code Online (Sandbox Code Playgroud)

如果没有其他 nix-shell 会话仍在使用数据库服务器,陷阱EXIT将关闭数据库服务器。