dmvianna Asked: 2018-08-23 03:32:26 +0800 CST2018-08-23 03:32:26 +0800 CST 2018-08-23 03:32:26 +0800 CST 杀死在 nix-shell 中启动的后台进程 772 我正在使用工具和数据库开发一个简单的数据科学环境。Python当我进入 时nix-shell,我启动了数据库进程。我想在退出环境时将其旋转下来。 我怎么能使用trap和nix实现呢? background-process trap 1 个回答 Voted Best Answer ivan 2018-12-19T05:25:22+08:002018-12-19T05:25:22+08:00 我一直在使用类似以下的东西: ./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陷阱将关闭数据库服务器。
我一直在使用类似以下的东西:
./shell.nix:
./nix/客户端
如果没有其他 nix-shell 会话仍在使用它,
EXIT
陷阱将关闭数据库服务器。