Wat er eigenlijk staat is: ik heb een script dat niet werkt, en ik denk dat dat komt vanwege een probleem met /bin/sh / /bin/bash, maar -ko- heeft mij op mijn fout gewezen. Nu heb ik nog steeds een script dat niet werkt, maar dat is een dusdanig specifiek script dat ik me afvraag of dat probleem hier wel thuishoort. Dus eigenlijk zou je kunnen zeggen dat na -ko-'s antwoord het topic al klaar was.
zomertje schreef op woensdag 23 september 2009 @ 21:06:
Meestal geef je in een script de hele paden aan naar commando's zodat je zeker weet dat ie het juiste commando kan vinden. Als je een script dan runt als een andere user bijvoorbeeld. Niet iedere user heeft dezelfde $PATH setting waarschijnlijk

Dat is bij een customised script dat je als service wil draaien natuurlijk niet echt een probleem, omdat op de machine waarop je het script hebt aangepast altijd dezelfde user het script zal draaien.
Ik kan op zich wel even het eigenlijke probleem schetsen. De software is dus PMS, met de volgende eigenschappen:
- Het is java software
- De software zelf wordt gestart middels een shell script, PMS.sh, die netjes een x-bit heeft staan
- In dezelfde directory (bij mij op dit moment nog even /usr/src/pms-linux-1.10.5) staat PMS.conf, de configuratie voor de software
- De software start een UPnP media server, die verschillende mediatypen kan aanbieden aan een UPnP media client, zoals de PS3
- Er wordt gebruikgemaakt van allerlei codecs om die media te tonen
Dan het probleem:
- Ik draai deze software op mijn headless linux server, die altijd aan staat, en waar ook al mijn media op is opgeslagen
- Als ik die machine een keer reboot om wat voor reden dan ook, dan wil ik natuurlijk dat die media server vanzelf weer opstart, vandaar dat ik hem als service wil gebruiken
- Het init script dat ik gebruik om de software te starten geeft problemen; ik heb het vermoeden dat er problemen zijn met het uitvoeren van shell commando's, al weet ik het niet helemaal zeker, maar 1 van de dingen die fout gaan is dat de directory waarin de software staat niet gevonden kan worden door het shell script; de software start wel, maar de PMS.conf file kan niet gevonden worden, wat betekent dat de default config gebruikt wordt (die onbruikbaar is)
Het init script ziet er als volgt uit:
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
| #! /bin/sh
### BEGIN INIT INFO
# Provides: pms
# Required-Start: $network $local_fs $remote_fs
# Required-Stop:
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: PS3 UPnP Media Server
### END INIT INFO
# Source init-functions:
source /lib/lsb/init-functions
# Script variables:
MONTH=`date +%Y-%m`
PMS_ROOT="/usr/src/pms-linux-1.10.5"
PMS_LOG="/var/log/pms/pms-$MONTH.log"
DESC="PS3 UPnP Media Server"
NAME="PMS.sh"
# Path to executable:
DAEMON="$PMS_ROOT/$NAME"
# Run as user/group [UPDATE THESE TO MAKE VALID]:
PMSUSER=kryz
PMSGROUP=kryz
# update PATH:
PATH="$PMS_ROOT:${PATH:+$PATH:}/usr/sbin:/sbin"
# export env-vars
export PATH PMS_ROOT PMS_LOG
# Exit if the package is not installed
if [ ! -x "$DAEMON" ]; then {
echo "Couldn't find $DAEMON or not executable"
exit 99
}
fi
#
# Function that starts the daemon/service
#
do_start() {
# Return
# 0 if daemon has been started
# 1 if daemon was already running
# 2 if daemon could not be started
cd "$PMS_ROOT"
start-stop-daemon --start --quiet --chuid $PMSUSER:$PMSGROUP --exec $DAEMON --test > /dev/null \
|| return 1
start-stop-daemon --start --quiet --chuid $PMSUSER:$PMSGROUP --exec $DAEMON \
|| return 2
}
#
# Function that stops the daemon/service
#
do_stop() {
# Return
# 0 if daemon has been stopped
# 1 if daemon was already stopped
# 2 if daemon could not be stopped
# other if a failure occurred
start-stop-daemon --stop --signal 2 --retry 5 --quiet --name java
RETVAL="$?"
[ "$RETVAL" = 2 ] && return 2
return "$RETVAL"
}
case "$1" in
start)
log_daemon_msg "Starting $DESC" "$NAME"
do_start
case "$?" in
0|1) log_end_msg 0 ;;
2) log_end_msg 1 ;;
esac
;;
stop)
log_daemon_msg "Stopping $DESC" "$NAME"
do_stop
case "$?" in
0|1) log_end_msg 0 ;;
2) log_end_msg 1 ;;
esac
;;
*)
echo "Usage: $SCRIPTNAME {start|stop}" >&2
exit 3
;;
esac
exit 0 |
Het PMS.sh bestand:
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
| #!/bin/sh
DIRNAME=`dirname $0`
# OS specific support (must be 'true' or 'false').
cygwin=false;
case "`uname`" in
CYGWIN*)
cygwin=true
;;
esac
# For Cygwin, ensure paths are in UNIX format before anything is touched
if $cygwin ; then
[ -n "$PMS_HOME" ] &&
PMS_HOME=`cygpath --unix "$PMS_HOME"`
[ -n "$JAVA_HOME" ] &&
JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
fi
# Setup PMS_HOME
if [ "x$PMS_HOME" = "x" ]; then
PMS_HOME=`cd $DIRNAME/; pwd`
fi
export PMS_HOME
# Setup the JVM
if [ "x$JAVA" = "x" ]; then
if [ "x$JAVA_HOME" != "x" ]; then
JAVA="$JAVA_HOME/bin/java"
else
JAVA="java"
fi
fi
# Setup the classpath
PMS_JAR="$PMS_HOME/pms.jar"
# For Cygwin, switch paths to Windows format before running java
if $cygwin; then
PMS_HOME=`cygpath --path --windows "$PMS_HOME"`
JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"`
PMS_CLASSPATH=`cygpath --path --windows "$PMS_CLASSPATH"`
fi
# Sanitycheck environment
[ "x$PMS_ROOT" = "x" ] && echo "[ERROR] Environment variable 'PMS_ROOT' not set properly!" && exit 1
[ "x$PMS_LOG" = "x" ] && echo "[ERROR] Environment variable 'PMS_LOG' not set properly!" && exit 1
# Execute the JVM
exec "$JAVA" $JAVA_OPTS -Xmx768M -Djava.encoding=UTF-8 -Djava.net.preferIPv4Stack=true -Djava.awt.headless=true -jar "$PMS_JAR" "$@" 2>&1 >> "$PMS_LOG" & |
Bij het uitvoeren van het init script krijg ik dit soort meldingen:
code:
1
2
3
4
| kryz@orcrist:~$ /etc/init.d/PS3MediaServerd start
/etc/init.d/PS3MediaServerd: 13: source: not found
/etc/init.d/PS3MediaServerd: 94: log_daemon_msg: not found
/etc/init.d/PS3MediaServerd: 94: log_end_msg: not found |
Nog wat kleine opmerkingen: bij het runnen van PMS.sh zelf, als user kryz, werkt het dus wel (als je maar in de juiste directory staat). Alleen als je het init script draait wordt de juiste directory dus niet gevonden (en misschien gaan er nog wel andere dingen mis, maar daar heb ik dan geen benul van).
Ik heb me rot gezocht, maar de oorzaak vind ik maar niet.