Background-Process
殺死在 nix-shell 中啟動的後台程序
我正在使用工具和數據庫開發一個簡單的數據科學環境。
Python
當我進入 時nix-shell
,我啟動了數據庫程序。我想在退出環境時將其旋轉下來。我怎麼能使用
trap
和nix
實現呢?
我一直在使用類似以下的東西:
./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
陷阱將關閉數據庫伺服器。