저는 간단한 데이터 과학을 개발 중입니다.환경Python
도구와 데이터베이스가 함께 제공됩니다 . 를 입력하면 nix-shell
데이터베이스 프로세스가 시작됩니다. 환경을 나갈 때 속도를 늦추고 싶습니다.
이것을 어떻게 사용 trap
하고 nix
달성할 수 있습니까?
답변1
나는 다음과 같은 것을 사용해 왔습니다.
./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
EXIT
다른 nix-shell 세션이 아직 데이터베이스 서버를 사용하고 있지 않으면 트랩이 데이터베이스 서버를 종료합니다.
답변2
이것은 하나의 명령으로 여러 명령을 호출하는 방법에 대한 @ivan의 답변에 대한 부록입니다 trap
.
shellHook =
let
# NOTE These are equivalent.
#
# shellHook = shellHook =
# '' ''
# trap \ trap \
# " "
# '' echo lofa
# + '' sleep 2
# echo lofa echo miez
# sleep 2 " \
# echo miez EXIT
# '' ''
# + '' ;
# " \
# EXIT
# ''
# ;
# Helper function to achieve the same
cleanUp =
shell_commands:
''
trap \
"
${ builtins.concatStringsSep "" shell_commands }
" \
EXIT
''
;
in
cleanUp [
''
echo -n "POSTGRES CLEANUP START..."
''
( builtins.readFile ./postgres/clean-up.sh )
''
echo "END"
''
]
;
당신은 또한 볼 수 있습니다이 게시물더 긴 예입니다.