nix-shell에서 시작된 백그라운드 프로세스 종료

nix-shell에서 시작된 백그라운드 프로세스 종료

저는 간단한 데이터 과학을 개발 중입니다.환경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"
      ''
    ]
  ;

당신은 또한 볼 수 있습니다이 게시물더 긴 예입니다.

관련 정보