Path settings init script onder Ubuntu

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Red devil
  • Registratie: December 1999
  • Laatst online: 11:35
Beste tweakerts,

Heb een programma dat ik wil starten bij het opstarten van mijn ubuntu server maar niet als root maar een user. Als ik het programma los start als ik ben ingelogd als user gaat alles perfect.

Het is me ook gelukt met een init script dat ik heb geplaatst in /etc/init.d en vervolgens gelinkt met
code:
1
sudo update-rc.d mijnscript defaults 98 02


In dit init scrpt wordt het programma met

code:
1
 su - $RUN_AS -c "$cmd"


Waarbij $RUN_AS de voorgedefinieerde gebruiker is.

Als ik top open, zie ik het programma staan met de goede user.
Echter, de bashrc van de betreffende user wordt niet meegenomen waardoor de PATH settings niet goed staan. Ik heb de PATH settings uitgespuugd in het programma en het lijkt behoorlijk default:

code:
1
/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games


Wie kan me vertellen hoe de tool de juiste PATH settings meekrijgt?

Acties:
  • 0 Henk 'm!

  • deadinspace
  • Registratie: Juni 2001
  • Laatst online: 08:15

deadinspace

The what goes where now?

Red devil schreef op donderdag 22 oktober 2015 @ 18:51:
Echter, de bashrc van de betreffende user wordt niet meegenomen waardoor de PATH settings niet goed staan.
.bashrc wordt alleen gebruikt voor bash sessies die èn interactief zijn (en dat is deze niet) èn die geen login-sessies zijn (en dat is dit volgensmij wel).

Misschien dat je een van de andere dozijn bash config files kunt gebruiken. Zie de bash manpage, sectie INVOCATION, voor details.
Wie kan me vertellen hoe de tool de juiste PATH settings meekrijgt?
Door de PATH variabele te setten en te exporten in het init script.

Maar is dat überhaupt nodig? Is het niet voldoende om een volledig pad naar het programma in kwestie te gebruiken?

Acties:
  • 0 Henk 'm!

  • Red devil
  • Registratie: December 1999
  • Laatst online: 11:35
deadinspace schreef op donderdag 22 oktober 2015 @ 20:26:
[...]

.bashrc wordt alleen gebruikt voor bash sessies die èn interactief zijn (en dat is deze niet) èn die geen login-sessies zijn (en dat is dit volgensmij wel).

Misschien dat je een van de andere dozijn bash config files kunt gebruiken. Zie de bash manpage, sectie INVOCATION, voor details.

[...]

Door de PATH variabele te setten en te exporten in het init script.

Maar is dat überhaupt nodig? Is het niet voldoende om een volledig pad naar het programma in kwestie te gebruiken?
Yes, gelukt! Gek genoeg had het instellen van PATH in de init file geen effect. Maar toen bedacht ik me dat het opstart script van het programma ook een bash programma is. Daar had het gek genoeg wel effect

Het beste zou zijn geweest om volledige paden naar het programma te gebruiken. Echter, ik maak veelal gebruik van externe tools en het is geen doen om alles bij langs te gaan en te fixen wat door een simpele PATH setting ook al goed werkt.

Bedankt voor de info, het zette mij op het juiste been _/-\o_

Acties:
  • 0 Henk 'm!

  • Hero of Time
  • Registratie: Oktober 2004
  • Laatst online: 30-09 22:30

Hero of Time

Moderator LNX

There is only one Legend

Als het vervolgprogramma of script geen correcte $PATH heeft, dan wordt de variabele niet geëxporteerd in het initiële script. Denk aan het volgende:
Bash:
1
2
3
4
#!/bin/bash
PATH="/bin:/usr/bin:/usr/local/bin:/opt"

bash pathscript

In 'pathscript' staat niets meer dan 'echo $PATH'. Wat je terug krijgt, is niet wat er hierboven staat als $PATH definitie. In het simpele geval mis je dan /opt.
Zou er 'export PATH=...' staan, of eronder export PATH, dan zie je dat wel. Je kan het zelf ook makkelijk testen door op de prompt een variabele te maken en dan 'bash' uitvoeren en de variabele proberen uit te lezen. Zonder export krijg je niets terug.

Commandline FTW | Tweakt met mate


Acties:
  • 0 Henk 'm!

  • Red devil
  • Registratie: December 1999
  • Laatst online: 11:35
Hero of Time schreef op donderdag 22 oktober 2015 @ 22:28:
Als het vervolgprogramma of script geen correcte $PATH heeft, dan wordt de variabele niet geëxporteerd in het initiële script. Denk aan het volgende:
Bash:
1
2
3
4
#!/bin/bash
PATH="/bin:/usr/bin:/usr/local/bin:/opt"

bash pathscript

In 'pathscript' staat niets meer dan 'echo $PATH'. Wat je terug krijgt, is niet wat er hierboven staat als $PATH definitie. In het simpele geval mis je dan /opt.
Zou er 'export PATH=...' staan, of eronder export PATH, dan zie je dat wel. Je kan het zelf ook makkelijk testen door op de prompt een variabele te maken en dan 'bash' uitvoeren en de variabele proberen uit te lezen. Zonder export krijg je niets terug.
Ja, goed bedacht, in eerste instantie ook zonder export getest. Later wel bedacht maar het maakt voor het init.script geen verschil. Hieronder de bovenkant van het script (wat de boel start):

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#!/bin/bash

#--- config

SERVICE_NAME=galaxy
RUN_AS=vagrant
RUN_IN=/home/vagrant/galaxy-dist

#--- main actions


start() {
        echo "Starting $SERVICE_NAME... "
        cmd="cd $RUN_IN && sh run.sh --daemon"
        PATH="/home/vagrant/tools:/home/vagrant/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games"
        export PATH
        case "$(id -un)" in
                $RUN_AS)
                        eval "$cmd"
                        ;;
                root)
                        su - $RUN_AS -c "$cmd"
                        ;;
                *)
                        echo "*** ERROR *** must be $RUN_AS or root in order to control this service" >&2
                        exit 1
        esac
        echo "...done."
}

Acties:
  • 0 Henk 'm!

  • Raynman
  • Registratie: Augustus 2004
  • Laatst online: 17:02
Red devil schreef op donderdag 22 oktober 2015 @ 20:43:
Gek genoeg had het instellen van PATH in de init file geen effect.
Heel gek inderdaad, als je vervolgens `su -` gebruikt...

Acties:
  • 0 Henk 'm!

  • Red devil
  • Registratie: December 1999
  • Laatst online: 11:35
Raynman schreef op vrijdag 23 oktober 2015 @ 10:21:
[...]
Heel gek inderdaad, als je vervolgens `su -` gebruikt...
Nou ja, in de .bashrc van de target user galaxy staat ook de betreffende PATH weer aangegeven. Dus dan zou hij die toch moeten pakken?

Acties:
  • 0 Henk 'm!

  • Hero of Time
  • Registratie: Oktober 2004
  • Laatst online: 30-09 22:30

Hero of Time

Moderator LNX

There is only one Legend

Nee, want het is geen interactieve shell. Er wordt dan geen .bashrc en .profile e.d. uitgelezen. Als jij een script start, krijg je toch ook niet al je .bashrc dingen mee? Zie dit:
(sasquatch@LLT0016 - Fri, 23 Oct 15, 10:46 Uptime: 0h 5m)
(/tmp $)> cat prompt
#!/bin/bash
echo $PS1
(sasquatch@LLT0016 - Fri, 23 Oct 15, 10:46 Uptime: 0h 6m)
(/tmp $)> bash prompt

(sasquatch@LLT0016 - Fri, 23 Oct 15, 10:46 Uptime: 0h 6m)
(/tmp $)> echo $PS1
\[\e]0;\u@\h: \w\a\]\[\e[1;36m\](\[\e[0;32m\]\u\[\e[1;37m\]@\[\e[1;34m\]\h\[\e[1;37m\] - \[\e[1;35m\]$(date "+%a, %d %b %y, %H:%M") \[\e[1;33m\]Uptime: $(upt)\[\e[1;36m\])\n(\[\e[1;37m\]${PWD} \$\[\e[1;36m\])>\[\e[0;00m\]

M'n shell, interactief, heeft een PS1 gezet, die komt uit m'n .bashrc. Het script dat aangeroepen wordt via bash, heeft geen PS1 waarde.

Commandline FTW | Tweakt met mate

Pagina: 1