Background-Process

殺死在 nix-shell 中啟動的後台程序

  • December 18, 2018

我正在使用工具和數據庫開發一個簡單的數據科學環境。Python當我進入 時nix-shell,我啟動了數據庫程序。我想在退出環境時將其旋轉下來。

我怎麼能使用trapnix實現呢?

我一直在使用類似以下的東西:

./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
 '';
}

./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

如果沒有其他 nix-shell 會話仍在使用它,EXIT陷阱將關閉數據庫伺服器。

引用自:https://unix.stackexchange.com/questions/464106