Killing background processes started in nix-shell












0














I am developing a simple data science environment with Python tools and a database. When I enter the nix-shell, I spin up the database process. I would like to spin it down when exiting the environment.



How could I use trap and nix to accomplish that?










share|improve this question



























    0














    I am developing a simple data science environment with Python tools and a database. When I enter the nix-shell, I spin up the database process. I would like to spin it down when exiting the environment.



    How could I use trap and nix to accomplish that?










    share|improve this question

























      0












      0








      0







      I am developing a simple data science environment with Python tools and a database. When I enter the nix-shell, I spin up the database process. I would like to spin it down when exiting the environment.



      How could I use trap and nix to accomplish that?










      share|improve this question













      I am developing a simple data science environment with Python tools and a database. When I enter the nix-shell, I spin up the database process. I would like to spin it down when exiting the environment.



      How could I use trap and nix to accomplish that?







      background-process trap nix nix-shell






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Aug 22 at 11:32









      dmvianna

      324312




      324312






















          1 Answer
          1






          active

          oldest

          votes


















          1














          I've been using something like the following:



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



          #! /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


          The EXIT trap will shut down the database server if no other nix-shell sessions are still using it.






          share|improve this answer





















            Your Answer








            StackExchange.ready(function() {
            var channelOptions = {
            tags: "".split(" "),
            id: "106"
            };
            initTagRenderer("".split(" "), "".split(" "), channelOptions);

            StackExchange.using("externalEditor", function() {
            // Have to fire editor after snippets, if snippets enabled
            if (StackExchange.settings.snippets.snippetsEnabled) {
            StackExchange.using("snippets", function() {
            createEditor();
            });
            }
            else {
            createEditor();
            }
            });

            function createEditor() {
            StackExchange.prepareEditor({
            heartbeatType: 'answer',
            autoActivateHeartbeat: false,
            convertImagesToLinks: false,
            noModals: true,
            showLowRepImageUploadWarning: true,
            reputationToPostImages: null,
            bindNavPrevention: true,
            postfix: "",
            imageUploader: {
            brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
            contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
            allowUrls: true
            },
            onDemand: true,
            discardSelector: ".discard-answer"
            ,immediatelyShowMarkdownHelp:true
            });


            }
            });














            draft saved

            draft discarded


















            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f464106%2fkilling-background-processes-started-in-nix-shell%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown

























            1 Answer
            1






            active

            oldest

            votes








            1 Answer
            1






            active

            oldest

            votes









            active

            oldest

            votes






            active

            oldest

            votes









            1














            I've been using something like the following:



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



            #! /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


            The EXIT trap will shut down the database server if no other nix-shell sessions are still using it.






            share|improve this answer


























              1














              I've been using something like the following:



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



              #! /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


              The EXIT trap will shut down the database server if no other nix-shell sessions are still using it.






              share|improve this answer
























                1












                1








                1






                I've been using something like the following:



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



                #! /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


                The EXIT trap will shut down the database server if no other nix-shell sessions are still using it.






                share|improve this answer












                I've been using something like the following:



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



                #! /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


                The EXIT trap will shut down the database server if no other nix-shell sessions are still using it.







                share|improve this answer












                share|improve this answer



                share|improve this answer










                answered Dec 18 at 13:25









                ivan

                697719




                697719






























                    draft saved

                    draft discarded




















































                    Thanks for contributing an answer to Unix & Linux Stack Exchange!


                    • Please be sure to answer the question. Provide details and share your research!

                    But avoid



                    • Asking for help, clarification, or responding to other answers.

                    • Making statements based on opinion; back them up with references or personal experience.


                    To learn more, see our tips on writing great answers.





                    Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


                    Please pay close attention to the following guidance:


                    • Please be sure to answer the question. Provide details and share your research!

                    But avoid



                    • Asking for help, clarification, or responding to other answers.

                    • Making statements based on opinion; back them up with references or personal experience.


                    To learn more, see our tips on writing great answers.




                    draft saved


                    draft discarded














                    StackExchange.ready(
                    function () {
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f464106%2fkilling-background-processes-started-in-nix-shell%23new-answer', 'question_page');
                    }
                    );

                    Post as a guest















                    Required, but never shown





















































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown

































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown







                    Popular posts from this blog

                    Morgemoulin

                    Scott Moir

                    Souastre