Search by Tags

How to Autorun application at the start up in Linux

 
Applicable for

Compare with Revision




Subscribe for this article updates

Purpose

This article describes how to automatically start an application during or after boot of a Colibri module running Embedded Linux.

Daemons

You can easily start your scripts or applications as daemons.
A daemon is an application that runs as a "background" process (without a terminal or user interface).

Systemd

Starting with V2.x of our Linux BSP we use systemd as our init and service manager.
systemd is a system and service manager for Linux, also capable of replacing the traditional SysV init system.
http://www.freedesktop.org/wiki/Software/systemd/
http://www.freedesktop.org/software/systemd/man/systemd.html

A unit configuration file whose name ends in .service encodes information about a process controlled and supervised by systemd.
Service files can be found in /etc/systemd/system/ and, for distribution provided ones in /lib/systemd/system/. Services can be started or permanently enabled using the systemctl command.


The common configuration items are configured in the generic "[Unit]" and "[Install]" sections. The service specific configuration options are configured in the "[Service]" section.
Service files must include a "[Service]" section, which carries information about the service and the process it supervises.
For more information on options of [Service] section refer to: http://www.freedesktop.org/software/systemd/man/systemd.service.html#Options

  • Procedure

Create a unit configuration file ending in .service
Copy the unit configuration file to "/etc/systemd/system" and use the systemctl tool for starting or permanently enabling the service.

  • Using the systemctl command

From: http://www.freedesktop.org/software/systemd/man/systemctl.html
Reload the systemd configuration and unit files:

root@colibri-t20:~# systemctl --system daemon-reload

Check status, start and stop a service, valid until next reboot:

root@colibri-t20:~# systemctl status <service_name>.service
root@colibri-t20:~# systemctl start <service_name>.service
root@colibri-t20:~# systemctl stop <service_name>.service

Add a service to or remove it from the ones started at boot. Note that this neither starts or stops the service but takes only effect during the next boot:

root@colibri-t20:~# systemctl enable <service_name>.service
root@colibri-t20:~# systemctl disable <service_name>.service

Example unit configuration file to automatically execute the (hypothetical) mydatalogger application at start up:

[Unit]
Description=mydatalogger service, collects and logs data in the background
After=multi-user.target
 
[Service]
Type=simple
ExecStart=/usr/bin/mydatalogger
 
[Install]
WantedBy=multi-user.target

Shells

/etc/profile

Each time a login shell is spawned the script /etc/profile plus all scripts in /etc/profile.d are executed. This is done for logins over a serial line, over an ssh connection and also for logins in the display manager to a graphical desktop.
/etc/profile is sourced upon login: it sets up the environment upon login and application-specific settings by sourcing any readable file in /etc/profile.d/.

Using /etc/profile is well suited to set the environment or to do some small tasks. Note that these scripts must return control in order to continue with the login.

Remove the file /etc/profile.d or the additions to /etc/profile in order to undo the automatic execution.

  • Procedure

Add a script file in /etc/profile.d/*.sh.

Example script file:

#!/bin/sh
#script file for deleting backup entries
rm /home/root/*~

Graphical

X11 Desktop

You can start applications automatically when you login into your Window Manager or Desktop Environment.

With the angstrom-lxde-image you get the following options, other desktop environments provide similar means:

The lxsession session manager can start applications when the graphical environment is started. This can be achieved in two ways:
- A lxsession specific way in which the entries in the files /etc/xdg/lxsession/LXDE/autostart and in ~/.config/lxsession/LXDE/autostart are parsed.
- A generic way which many session managers support. Files in the folders /etc/xdg/autostart/ and ~/.config/autostart/ ending in .desktop get parsed and if applicable the application described therein is started.

http://wiki.lxde.org/en/LXSession

LXSession Autostart File

Edit /etc/xdg/lxsession/LXDE/autostart or ~/.config/lxsession/LXDE/autostart. Add the application to a new line in the file. If you want that your application gets restarted should it get terminated abnormally, precede the application name with a @.

e.g at @lxterminal to /etc/xdg/lxsession/LXDE/autostart

@lxpanel --profile LXDE
@pcmanfm --desktop --profile LXDE
@xscreensaver -no-splash
@lxterminal

Note that this file is not a shell script and therefore shell acrobatics like redirectors and pipes are not allowed. If required this can be worked around by spawning a custom shell script which in turn can support the full shell feature set.

.desktop Files

Creating a .desktop file.
Adding the .desktop file to autostart.

http://standards.freedesktop.org/desktop-entry-spec/latest/
Note that in /usr/share/applications/ a number of .desktop files already exists which can be copied into the autostart folder

For Example:
If you want to execute lxterminal automatically at startup.
Create a terminal.desktop in /etc/xdg/autostart/ .
Add some keys like:

  • [Desktop Entry]. (Must be the first line of every desktop file and is the section header to identify the block of key value pairs associated with the desktop. Necessary for the desktop to recognize the file correctly.)
  • Name of the application.(The name of the Desktop Entry group - should be unique on the system )
  • Type of the application. (Possible values are "Application", "Link" or "Directory".)
  • Exec filename of the application plus optionally arguments.
  • Terminal (Describes whether the application should run in a terminal.)

File content with the entries should be as follows:

[Desktop Entry]
Name=LXTerminal
Type=Application
Exec=lxterminal
Terminal=false

Save the .desktop file.
Note: A graphical file manager will list .desktop files not with their file name but rather with the value of the key "Name". e.g. in the example above "LXTerminal".

To disable the automatic start of an application, just either remove the respective .desktop file from /etc/xdg/autostart/ and/or .config/autostart/ or add the key NotShowIn=LXDE; to the desktop file. Alternatively use the graphical front end 'LXDE Menu'/Preferences/'Desktop Session Settings' and untick the 'Enabled' checkbox.

X11 with One User Application

If one wants to start X11, maybe start some configuration tasks like keyboard mapping, touch screen calibration and then start the one and only user application one could adopt a scheme like the one used in angstrom-qt5-x11-image and qt4e-demo-image.

Script Started by Systemd

The qt4e-demo-image and angstrom-qt5-x11-image (prior to 2.8b2) use a systemd service and a home brew script. The script starts the X-server followed by the user application. Integrating any setup tasks between the start of X11 and the start of the user application into the script produces a bunch of issues as this sometimes stops the X-server and so on.

However for a simple system that might be enough.

To start your X11 application instead of the demo application change the script accordingly.

Using nodm, xinit, and a Custom Script

The angstrom-qt5-x11-image (starting with 2.8b2) uses the simple display manager nodm from OpenEmbedded to start X11. This uses the configuration data in /etc/X11, e.g. Xsession.d, e.g. to start the touch calibrator. As the last step it searches for a script x-window-manager and sources that one.

To start your X11 application override the following two variables in the x-window-simple-app recipe to set the initial working directory and to specify the application:

INITIAL_PATH ?= "/usr/share/qtsmarthome-1.0"
X_APPLICATION ?= "${INITIAL_PATH}/smarthome"