I have set up an init-script to control the state of a VirtualBox VM:

#chkconfig: 35 99 5
#description: vTiger virtual machine

# Provides: vtigervm
# Required-Start: $local_fs
# Requider-Stop: $stop_fs
# Default-Start: 3 5
# Default-Stop: 0 1 2 6
# Short-Description: Manage vTiger virtual machine
# Description: Utility to start and stop vTiger virtual machine on VirtualBox

    echo -n "Starting vTiger"
    su myuser -c '/usr/bin/VBoxManage startvm "vTiger" --type headless'
    echo "Started virtual machine" >> /var/log/messages

    echo -n "Shutting vTiger down..."
    su myuser-c '/usr/bin/VBoxManage controlvm "vTiger" acpipowerbutton'
    while [ ! -z "`su - juhani -c '/usr/bin/VBoxManage list runningvms | grep vTiger'`" ]; do
        echo -n "."
        sleep 1
    echo "Done."
    echo "Stopped virtual machine" >> /var/log/messages

    echo -n "Running VMs: "
    su myuser -c '/usr/bin/VBoxManage list runningvms'
    if [ -z "`su - juhani -c '/usr/bin/VBoxManage list runningvms | grep vTiger'`" ]; then
    echo "Queried virtual machine status" >> /var/log/messages

echo "Called virtual machine management script with: $1" >> /var/log/messages
case "$1" in




        echo $"Usage: $0 {start|stop|restart|status}"
        exit 1

exit $RETVAL

The system is CentOS 6.5. If I manually run service [start|stop|status] vtigervm, it works as I expect it to. If the VM is running, $? after the service vtigervm status returns 0, and 3 if it is stopped. I installed it with chkconfig and it created among a few others rc5.d/S99vtigervm and rc0.d/K05vtigervm.

The problem

When I start the system it starts the "service", but on shutdown it does not even run the scripts.

grep "virtual machine" /var/log/messages shows:

*[machine starting]*
Called virtual machine management script with: start
Started virtual machine
*[shutdown -h now]*
*[machine stopped]*

What I expect:

*[machine starting]*
Called virtual machine management script with: start
Started virtual machine 
*[shutdown -h now]*
Called virtual machine management script with: status
Queried virtual machine status
Called virtual machine management script with: stop
Stopped virtual machine
*[machine stopped]*

File permissions & etc:

# ls -lah /etc/rc0.d/
lrwxrwxrwx. 1 root root 13 7.2. 17:49 /etc/rc0.d/K05atd -> ../initd.d/atd
lrwxrwxrwx. 1 root root 18 9.2. 00:06 /etc/rc0.d/K05vtigervm -> ../initd.d/vtigervm
  • I found this dup which didn't have a workable A. I've flagged the other as a dup to this one, since it has actual solutions to the problem. unix.stackexchange.com/questions/71941/… – slm Feb 9 '14 at 1:41
  • @slm I only found one on stackoverflow, which didn't really have an aswer (for me atleast) – varesa Feb 9 '14 at 1:47
  • Yeah surprisingly there wasn't a lot of ppl having this particular issue which I find suspicious. – slm Feb 9 '14 at 1:49

Idea #1

Try putting a -x at the top of the service script, this will put the shell into debug mode so that you'll get any output that's being generated by the script.

#!/bin/sh -x

Idea #2

Also you might want to add the process name to the top of the chkconfig comment macros as well.

# processname: vtigervm

You may need to change this value to whatever's appropriate for you situation.

Idea #3

As suggested in @RickBeam's answer and confirmed by this link I found on the CentOS forums, titled: "chkconfig/init.d not calling shutdown with solution", you'll need to manage the creation and destruction of a file in /var/lock/subsys. You can add these lines to your start() and stop() functions to do it:

touch /var/lock/subsys/vtigervm

stop() {
rm -f /var/lock/subsys/vtigervm
  • Even if it never starts a process called like that? – varesa Feb 9 '14 at 0:47
  • Sorry change the name to whatever it actually is. – slm Feb 9 '14 at 0:52
  • Also, where does -x send the output to, if the script is run by init? dmesg//var/log/messages? – varesa Feb 9 '14 at 0:59
  • Yes it should go to /var/log/messages. – slm Feb 9 '14 at 1:02
  • Your answer isn't an answer. When(if) deleted, the DV will go with it. – Ricky Beam Feb 9 '14 at 1:24

Your script has to touch /var/lock/subsys/... to indicate it's running. Look at the atd or crond init scripts as an example, and /etc/rc for how it's actually parsed.

(Note: I'm looking at /etc/rc for Fedora)

# First, run the KILL scripts.
for i in /etc/rc$runlevel.d/K* ; do

    # Check if the subsystem is already up.
    [ -f /var/lock/subsys/$subsys -o -f /var/lock/subsys/$subsys.init ] \
            || continue
    check_runlevel "$i" || continue

    # Bring the subsystem down.
    [ -n "$UPSTART" ] && initctl emit --quiet stopping JOB=$subsys
    $i stop
    [ -n "$UPSTART" ] && initctl emit --quiet stopped JOB=$subsys
  • Ok, I thought status returning valid codes was enough. – varesa Feb 9 '14 at 0:47
  • FC2, but CentOS does exactly the same thing. (exact same file, in fact) – Ricky Beam Feb 9 '14 at 0:55
  • @slm Maybe it's because of some hard-to-update software? I know a few companies that still have a bunch of old DOS pcs and some Netware stuff in-house – varesa Feb 9 '14 at 1:03
  • 1
    It's obviously not an original FC2 (nor is the RH9 machine). Or, the, ahem, RH 4.1 machine. (holy cow, it's running a 14 year old kernel!!!, dual PII-333) There's a RH6.2(?) around here somewhere -- i.e. the last sparc release. – Ricky Beam Feb 9 '14 at 1:06
  • @varesa, it's more a factor of "you don't upgrade FC, you reinstall" which is why I've used debian for many years now. – Ricky Beam Feb 9 '14 at 1:07

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.