Create a gist now

Instantly share code, notes, and snippets.

What would you like to do?
xvfb init script for Ubuntu
XVFB=/usr/bin/Xvfb
XVFBARGS=":1 -screen 0 1024x768x24 -ac +extension GLX +render -noreset"
PIDFILE=/var/run/xvfb.pid
case "$1" in
start)
echo -n "Starting virtual X frame buffer: Xvfb"
start-stop-daemon --start --quiet --pidfile $PIDFILE --make-pidfile --background --exec $XVFB -- $XVFBARGS
echo "."
;;
stop)
echo -n "Stopping virtual X frame buffer: Xvfb"
start-stop-daemon --stop --quiet --pidfile $PIDFILE
echo "."
;;
restart)
$0 stop
$0 start
;;
*)
echo "Usage: /etc/init.d/xvfb {start|stop|restart}"
exit 1
esac
exit 0
@julianvargasalvarez

This comment has been minimized.

Show comment Hide comment
@julianvargasalvarez

julianvargasalvarez Oct 6, 2013

Cool man, thanks, could you pleas include some instructions on how to get this thing working, I am new to this topic. Thanks again.

Cool man, thanks, could you pleas include some instructions on how to get this thing working, I am new to this topic. Thanks again.

@Dan2552

This comment has been minimized.

Show comment Hide comment
@Dan2552

Dan2552 Nov 30, 2013

@julianvargasalvarez you're probably past this after 2 months, but just incase & for others:

install xvfb (e.g. Through apt-get if you're using a Debian system)
put the contents of the gist as a file residing at /etc/init.d/xvfb
you'll probably need to make it executable chmod +x /etc/init.d/xvfb
and then you can start it with /etc/init.d/xvfb start

The script will start the virtual display at :1 so make sure to set your environment variable appropriately (export DISPLAY=:1) before running whatever you want to run inside the virtual x frame buffer.

Dan2552 commented Nov 30, 2013

@julianvargasalvarez you're probably past this after 2 months, but just incase & for others:

install xvfb (e.g. Through apt-get if you're using a Debian system)
put the contents of the gist as a file residing at /etc/init.d/xvfb
you'll probably need to make it executable chmod +x /etc/init.d/xvfb
and then you can start it with /etc/init.d/xvfb start

The script will start the virtual display at :1 so make sure to set your environment variable appropriately (export DISPLAY=:1) before running whatever you want to run inside the virtual x frame buffer.

@vitobotta

This comment has been minimized.

Show comment Hide comment
@vitobotta

vitobotta Jan 2, 2014

Hi, just wanted to say thanks, it helped. :)

Hi, just wanted to say thanks, it helped. :)

@dloman

This comment has been minimized.

Show comment Hide comment
@dloman

dloman Jan 7, 2014

Thanks for the script. I forked and added LSB init info to this script (would do a pull request but not possible with gists) if you want to add as well go for it

https://gist.github.com/dloman/8303932

dloman commented Jan 7, 2014

Thanks for the script. I forked and added LSB init info to this script (would do a pull request but not possible with gists) if you want to add as well go for it

https://gist.github.com/dloman/8303932

@patocox

This comment has been minimized.

Show comment Hide comment
@patocox

patocox Mar 26, 2014

Thanks for this!
After stopping, however, I always receive the error:

Stopping virtual X frame buffer: Xvfbstart-stop-daemon: warning: failed to kill 7865: No such process.

7865 being the process number in the pidfile.

patocox commented Mar 26, 2014

Thanks for this!
After stopping, however, I always receive the error:

Stopping virtual X frame buffer: Xvfbstart-stop-daemon: warning: failed to kill 7865: No such process.

7865 being the process number in the pidfile.

@enl

This comment has been minimized.

Show comment Hide comment
@enl

enl Dec 11, 2014

The script doesn't actually stop Xvfb

# /etc/init.d/xvfb start
Starting virtual X frame buffer: Xvfb.
# pgrep Xvfb
2699
# /etc/init.d/xvfb stop
Stopping virtual X frame buffer: Xvfbstart-stop-daemon: warning: failed to kill 7547: No such process       

7547 is value from pidfile. Something goes wrong and process doesn't stop :(

enl commented Dec 11, 2014

The script doesn't actually stop Xvfb

# /etc/init.d/xvfb start
Starting virtual X frame buffer: Xvfb.
# pgrep Xvfb
2699
# /etc/init.d/xvfb stop
Stopping virtual X frame buffer: Xvfbstart-stop-daemon: warning: failed to kill 7547: No such process       

7547 is value from pidfile. Something goes wrong and process doesn't stop :(

@nddipiazza

This comment has been minimized.

Show comment Hide comment
@nddipiazza

nddipiazza May 26, 2015

Nice! Totally stealing this.

Nice! Totally stealing this.

@josephdpurcell

This comment has been minimized.

Show comment Hide comment
@josephdpurcell

josephdpurcell Jul 17, 2015

This did not automatically start Xvfb on boot. Instead, I used https://gist.github.com/dloman/8303932 and that works.

This did not automatically start Xvfb on boot. Instead, I used https://gist.github.com/dloman/8303932 and that works.

@madbonez

This comment has been minimized.

Show comment Hide comment
@madbonez

madbonez Sep 17, 2015

Very helpfull. Thanks!

Very helpfull. Thanks!

@madbonez

This comment has been minimized.

Show comment Hide comment
@madbonez

madbonez Sep 19, 2015

rm $PIDFILE
missing

rm $PIDFILE
missing

@Vic-L

This comment has been minimized.

Show comment Hide comment
@Vic-L

Vic-L Nov 3, 2015

thx too!

Vic-L commented Nov 3, 2015

thx too!

@griffingdm

This comment has been minimized.

Show comment Hide comment
@griffingdm

griffingdm Nov 11, 2015

is there a way to also include the

export DISPLAY=":1"

in this script?

is there a way to also include the

export DISPLAY=":1"

in this script?

@Cryptophobia

This comment has been minimized.

Show comment Hide comment
@Cryptophobia

Cryptophobia Jun 29, 2016

This was very helpful, thank you! :)

This was very helpful, thank you! :)

@AmrinderGrewal

This comment has been minimized.

Show comment Hide comment
@AmrinderGrewal

AmrinderGrewal Jul 1, 2016

Thanks this is helpful.
I am using this rather small but efficient like above

!/bin/bash

if [ -z "$1" ]; then
echo "basename $0 {start|stop}"
exit
fi
case "$1" in
start)
/usr/bin/Xvfb :0 -ac -screen 0 1960x2000x24 &;;
stop)
killall Xvfb;;

Thanks this is helpful.
I am using this rather small but efficient like above

!/bin/bash

if [ -z "$1" ]; then
echo "basename $0 {start|stop}"
exit
fi
case "$1" in
start)
/usr/bin/Xvfb :0 -ac -screen 0 1960x2000x24 &;;
stop)
killall Xvfb;;

@tony19

This comment has been minimized.

Show comment Hide comment
@tony19

tony19 Aug 9, 2016

@amrindertweddle nice, but missing esac

tony19 commented Aug 9, 2016

@amrindertweddle nice, but missing esac

@CreaThor

This comment has been minimized.

Show comment Hide comment
@CreaThor

CreaThor Nov 16, 2016

Hi, i started Xvfb and after start tests i received:

org.openqa.selenium.firefox.NotConnectedException: Unable to connect to host 127.0.0.1 on port 7055 after 45000 ms. Firefox console output:
XPCOMGlueLoad error for file /home/jenkins/firefox/libmozgtk.so:
libgtk-3.so.0: cannot open shared object file: No such file or directory
Couldn't load XPCOM.

Firefox 46.01, Selenium 2.53.1
i haven't any problems with the same versions Firefox and Selenium on local machine
any ideas ?

Hi, i started Xvfb and after start tests i received:

org.openqa.selenium.firefox.NotConnectedException: Unable to connect to host 127.0.0.1 on port 7055 after 45000 ms. Firefox console output:
XPCOMGlueLoad error for file /home/jenkins/firefox/libmozgtk.so:
libgtk-3.so.0: cannot open shared object file: No such file or directory
Couldn't load XPCOM.

Firefox 46.01, Selenium 2.53.1
i haven't any problems with the same versions Firefox and Selenium on local machine
any ideas ?

@GvS666

This comment has been minimized.

Show comment Hide comment
@GvS666

GvS666 Sep 27, 2017

I'm suddenly getting following error. Script worked before:

/etc/init.d/xvfb: line 4: syntax error near unexpected token `$'in\r''
'etc/init.d/xvfb: line 4: `case "$1" in

any ideas what could be wrong?

Edit:
It was windows line endings. Fixed it with sed -i 's/\r//' /etc/init.d/xvfb

GvS666 commented Sep 27, 2017

I'm suddenly getting following error. Script worked before:

/etc/init.d/xvfb: line 4: syntax error near unexpected token `$'in\r''
'etc/init.d/xvfb: line 4: `case "$1" in

any ideas what could be wrong?

Edit:
It was windows line endings. Fixed it with sed -i 's/\r//' /etc/init.d/xvfb

@OrrinGradwell

This comment has been minimized.

Show comment Hide comment
@OrrinGradwell

OrrinGradwell Oct 11, 2017

Just for the interested.
I created the following little script that works like a charm...

#!/bin/bash
(
    trap 'kill $ids' EXIT
    
    Xvfb :8 -screen 8 1920x1080x24 -ac +extension GLX +render -noreset > /dev/null 2>&! &
    ids="$ids $!"

    DISPLAY=:8 java -Dwebdriver.gecko.driver=/<path to>/geckodriver -Dchrome.binary=/opt/google/chrome/chrome -Dwebdriver.chrome.bin=/usr/bin/google-chrome -Dwebdriver.chrome.driver=/<path to>/chromedriver -jar /<path to selenium>.jar -host 127.0.0.1 -port 4444 > /dev/null 2>&1 &
    ids="$ids  $!"

    echo -e "\e[35m\e[1mSpinning up Selenium Server\e[0m"
    while ! nc -z localhost 4444; do echo -en ".\e[0m" && sleep 1; done

    #Your code here!#
)

What this does is that it launches Xvfb in the background and set the PID as a var.
The same happens with selenium..

Then it waits for selenium to be fully up and running by pinging the port until a valid response is received and only when that happens, then the rest of the code start..

As soon as all your code has been executed, regardless of the exit code, Xvfb is then shut down as well as Selenium forcing a clean session every time...

Just for the interested.
I created the following little script that works like a charm...

#!/bin/bash
(
    trap 'kill $ids' EXIT
    
    Xvfb :8 -screen 8 1920x1080x24 -ac +extension GLX +render -noreset > /dev/null 2>&! &
    ids="$ids $!"

    DISPLAY=:8 java -Dwebdriver.gecko.driver=/<path to>/geckodriver -Dchrome.binary=/opt/google/chrome/chrome -Dwebdriver.chrome.bin=/usr/bin/google-chrome -Dwebdriver.chrome.driver=/<path to>/chromedriver -jar /<path to selenium>.jar -host 127.0.0.1 -port 4444 > /dev/null 2>&1 &
    ids="$ids  $!"

    echo -e "\e[35m\e[1mSpinning up Selenium Server\e[0m"
    while ! nc -z localhost 4444; do echo -en ".\e[0m" && sleep 1; done

    #Your code here!#
)

What this does is that it launches Xvfb in the background and set the PID as a var.
The same happens with selenium..

Then it waits for selenium to be fully up and running by pinging the port until a valid response is received and only when that happens, then the rest of the code start..

As soon as all your code has been executed, regardless of the exit code, Xvfb is then shut down as well as Selenium forcing a clean session every time...

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment