The following script is an LSB compliant init.d script allowing the carte webserver of pdi (kettle) to start at boot time.
Once the script is copied at /etc/init.d/carte you can use it the usual way:
service carte start service carte status service carte stop service carte restart
To actually have carte started at boot time, register the script with chkconfig for redhat flavours:
chkconfig --add carte
or use update-rc.d carte defaults on debian flavours:
update-rc.d carte defaults
Note that under Redhat it uses the ‘/etc/rc.d/init.d/functions’ helper script which gives out nice colored output for [OK] or [FAILED]. If this script does not exist, a fallback is present, a bit less nice but working just as well. This means that in theory this script should work under all flavors of Linux.
There are a few configuration variables near the top of the script (user to run carte under, path to carte and port to listen to), but that is about it. You can find the script on github as well.
#!/bin/bash # Start the carte server as a daemon, and helps managing it in a normal # (service carte start/stop/status) way. # Licence: FreeBSD, do what you want with it but do not hold me responsible. ### BEGIN INIT INFO # Provides: pdi # Required-Start: $network $syslog $remote_fs # Required-Stop: $network $syslog # Default-Start: 3 5 # Default-Stop: 0 1 2 4 6 # Short-Description: Pentaho Carte Server # Description: Pentaho Carte Server # ### END INIT INFO ## configuration directives # Which user does carte run under? PDIUSER=pentaho # On which port should it listen? CARTEPORT=80 # Where is pdi installed? PDIROOT=/opt/pentaho_pdi # Normal output log LOGOUT=/var/log/pentaho_pdi.out.log # Error output log LOGERR=/var/log/pentaho_pdi.err.log ## script start here # Note: The functions script is RH only. It is only used here for sexy (colored) # output of [OK] or [FAILED] via echo_failure and echo_success. # # To make this script work under other flavors of linux, the 2 echo_ functions # are first defined in a portable (but unsexy) way. If the RH functions script # exists, its definition will override the portable way. function echo_failure() { echo -en "\n[FAILED]"; } function echo_success() { echo -en "\n[OK]"; } [ -f /etc/rc.d/init.d/functions ] && source /etc/rc.d/init.d/functions # Very useful for debugging #set -x # Find PID of the newest (-n) process owned by $PDIUSER (-u) with carte.sh on # the full (-f) command, arguments included. # => this should yield the pid of 'sh ./carte.sh' on STDOUT, with a status of 0 # if there is such a process, 1 otherwise FINDPID="pgrep -u $PDIUSER -n -f carte.sh"; function _is_running() { $FINDPID 1>/dev/null return $? } function stop_carte() { _is_running if [ $? -ne 0 ]; then echo -n "$0 is not running, cannot stop." echo_failure echo return 1 else echo -n "Stopping $0..." # Finding the pid of carte.sh from $FINDPID. Killing it would leave its # child, the actual java process, running. # Find this java process via ps and kill it. $FINDPID | xargs ps h -o pid --ppid | xargs kill sleep 1 _is_running if [ $? -eq 0 ]; then echo_failure echo return 1 else echo_success echo return 0 fi fi } function status() { _is_running if [ $? -eq 0 ]; then echo -n "$0 is running." echo_success echo return 0 else echo -n "$0 does not run." echo_failure echo return 1 fi } function start_carte() { _is_running if [ $? -eq 0 ]; then echo -n "$0 already running." echo_failure echo return 1 else echo -n "Starting $0..." # Make sure log files exist and are writable by $PDIUSER first touch $LOGOUT $LOGERR chown $PDIUSER:$PDIUSER $LOGOUT $LOGERR su - $PDIUSER -c "cd $PDIROOT && (nohup sh ./carte.sh $(hostname -i) $CARTEPORT 0<&- 1>>$LOGOUT 2>>$LOGERR &)" sleep 1 _is_running if [ $? -eq 0 ]; then echo_success echo return 0 else echo_failure echo return 1 fi fi } case "$1" in start) start_carte exit $? ;; stop) stop_carte exit $? ;; reload|force-reload|restart|force-restart) stop_carte if [ $? -eq 0 ]; then start_carte exit $? else exit 1 fi ;; status) status exit $? ;; *) echo "Usage: $0 {start|stop|restart|status}" exit 2 esac exit 0
Pingback: Build a rpm for pentaho pdi (kettle) | This DWH guy
Hi, in lines 52 and 111 the HTML formatting screwed up the “>” sign.
Running Ubuntu 14.04 LTS, I had to replace #!/bin/sh with #!/bin/bash because /bin/sh didn’t like the function definitions in your script. Plus, in line 64, you might want to fix the typo “Stoping” with “Stopping” 🙂
In Ubuntu the command to have carte started at boot time would be:
update-rc.d carte defaults
Otherwise, your script is very helpful, thanks a lot!
Cheers,
Stefan
Thanks a lot for your comments, I updated the post.
I’m glad this script could be of help!
Hello dear,
Thanks for your job, If it helps anyone, I have ajusted the script to add a host to it by changing
“su – $PDIUSER -c “cd $PDIROOT && (nohup sh ./carte.sh $CARTEHOST $CARTEPORT 0>$LOGOUT 2>>$LOGERR &)””
Also added:
CARTEHOST=x.x.x.x
Regards
Hi,
Thanks for the script.
I saw that when stop the service doesnt kill the process. I am trying with pdi 9. Have you tried with this version?.
I also made a change for include the configuration.xml
Hi,
Sorry I since changed jobs and I’m not using PDI anymore.
I would suggest to look at what $FINDPID actually finds. Otherwise I’m not too sure.
Good luck!