@Aquarius Power's suggestion is helpful, but there are easier ways to control the running of things in the background in a startup script. This first assumes you have a startup script of some sort - if not, it might be useful to create a startup script, make it executable, and then add it to your startup items. You could then remove things from the list of startup items and start them up in your script with some delay - but you have to make sure they handle any ordering dependencies.
And you could use the 'execLater' script idea that Aquarius has, but an easier way to run things in the background that allows for some amount of ordering is to use the shell's ability to start a full shell line in the background.
For example, this in a shell script:
sleep 20 ; run_something
run_something_else
Will cause the shell script to block on that line for 20 seconds before running anything after it such as 'run_something_else'
This doesn't work because it only puts the 'sleep' command in the background and then runs 'run_something' immediately:
sleep 20 & ; run_something
The solution? Spawning a new shell and putting that in the background:
( sleep 20 ; run_something ) &
That will combine the "sleep 20" and the "run_something" and put them both in the background.
This can be combined into more complicated dependencies. For example, I have a process that starts up my music daemon (mpd) and I don't want to start my two clients (sonata and cantata) until the music player is up - and I run wmctrl to make cantata sticky to all desktops. And I don't want any of this to block the rest of my startup script, so I have:
( sudo /root/startMPD ; sleep 3 ; sonata & cantata & sleep 5 ; wmctrl -r cantata -b add,sticky ) &
Although I actually use full paths for everything. Note that sonata and cantata start up in the background and then the sleep 5 holds the wmctrl to give cantata a chance to startup. It helps to understand that in a shell, these two lines are the same:
cantata & ; sleep 5
cantata & sleep 5
It's also worth knowing that you can make future commands dependent on whether previous commands were successful using '&&' and '||' (note the difference between '&&' and '&'. For example if you ran your shell script on many systems and only some had cantata installed you could do:
cantanta && ( sleep 5 ; wmctrl ... )
Notice we needed the parens again, otherwise only the 'sleep 5' would be conditional and the wmctrl would not be. You can test this yourself in a shell with simple examples, such as:
ls /does_not_exist && ( echo a ; echo b )
If it gets too complicated, then you might want to consider changing to a more sophisticated scripting language such perl/ruby/python/etc..
/etc/xdg/autostart/*.desktop
files under Xubuntu 14.04. But if you have 4 cores, then I'm guessing you have a relatively new box, so the 45s startup time is way too much. Could you maybe post the results ofls -l /etc/xdg/autostart
so someone can point out any anomalies?