29

I have no idea where to start looking. I've been reading about daemons and didn't understand the concept.

More details :

  • I've been writing a crawler which never stops and crawlers over RSS in the internet.
  • The crawler has been written in java - therefore its a jar right now.
  • I'm an administrator on a machine that has Ubuntu 11.04 .
  • There is some chances for the machine to crash , so I'd like the crawler to run every time you startup the machine.
  • Furthermore, I'd like it to keep running even when i logged out. I'm not sure this is possible, but most of the time I'm logged out, and I still want to it crawl.

Any ideas? Can someone point me in the right direction?

Just looking for the simplest solution.

7 Answers 7

34

Here's a easy way to do that using SysVInit. Instructions:

  1. Create the start and the stop script of your application. Put it on some directory, in our example is:

    • Start Script: /usr/local/bin/myapp-start.sh
    • Stop Script: /usr/local/bin/myapp-stop.sh

    Each one will provide the instructions to run/stop the app. For instance the myapp-start.sh content can be as simple as the following:

    #!/bin/bash
    
    java -jar myapp.jar 
    

    For the stop script it can be something like this:

    #!/bin/bash
    # Grabs and kill a process from the pidlist that has the word myapp
    
    pid=`ps aux | grep myapp | awk '{print $2}'`
    kill -9 $pid
    
  2. Create the following script (myscript) and put it on /etc/init.d.

    /etc/init.d/myscript content:

    #!/bin/bash
    # MyApp
    #
    # description: bla bla
    
    case $1 in
        start)
            /bin/bash /usr/local/bin/myapp-start.sh
        ;;
        stop)
            /bin/bash /usr/local/bin/myapp-stop.sh
        ;;
        restart)
            /bin/bash /usr/local/bin/myapp-stop.sh
            /bin/bash /usr/local/bin/myapp-start.sh
        ;;
    esac
    exit 0
    
  3. Put the script to start with the system (using SysV). Just run the following command (as root):

    update-rc.d myscript defaults 
    

PS: I know that Upstart is great and bla bla, but I preffer the old SysV init system.

8
  • 1
    But how do the system will know what parameter will use? How to set to be the "start". Tried here and it did not work. Mar 19, 2015 at 20:05
  • 1
    This works, but the command "service myapp start" do not exit the command.
    – Tobia
    Jun 22, 2015 at 8:46
  • Now how to use the start|stop|restart options in myscript ?
    – Codevalley
    Jul 29, 2015 at 10:21
  • 1
    Also, even after doing the 3 steps, my jar is not running on startup. Are you sure if we have to change permissions, or path or something like that?
    – Codevalley
    Jul 29, 2015 at 10:26
  • 2
    This worked for me, thank you. But I had to make the last script ('myscipt' in your example) executable with this command: chmod 755 /etc/init.d/myscript . Otherwise update-rc.d command couldn't execute it.
    – er-han
    Mar 4, 2017 at 17:51
6

Yes! It is possible. :) Upstart is the way to go to make sure the service stays running. It has five packages, all installed by default:

  • Upstart init daemon and initctl utility
  • upstart-logd provides the logd daemon and job definition file for logd service
  • upstart-compat-sysv provides job definition files for the rc tasks and the reboot, runlevel, shutdown, and telinit tools that provide compatibility with SysVinit
  • startup-tasks provides job definition files for system startup tasks
  • system-services provides job definition files for tty services

The learning is very enjoyable and well worth it. Upstart has a website: http://upstart.ubuntu.com/

1
  • 1
    From the Upstart website, as of 2019: "Project is in maintaince mode only. No new features are being developed and the general advice would be to move over to another minimal init system or systemd"
    – Nav
    Jan 23, 2019 at 11:47
2

3 quick suggestions...

  1. Create a Start script in /etc/rc3.d (multiuser console mode) with corresponding Kill scripts in /etc/rc.0 and /etc/rc6.d to kill your Java program in a controlled way when the system powers down (runevel 0) or reboots (runlevel 6) See An introduction to Runlevels.

    You might be able to start your Java app in runlevel 2 (rc2.d) but, as a crawler, it will need TCP/IP. So make sure your networking service is available/started in your runlevel 2 beforehand. Networking is definitely up in runlevel 3.

    /etc/init.d contains all the actual start/kill scripts. /etc/rcN.d directories just contain links to them, prefixed with S or K to start or kill them respectively, per runlevel N.

  2. A process run by crond should persist between logouts. Maybe add it to your crontab.

  3. A process run with nohup should also persist. See nohup: run a command even after you logout.

    $ nohup java -jar myapp.jar &
    

    By default, myapp.jar's standard output will go to a file named ./nohup.out, or $HOME/nohup.out if the former isn't writeable.

1
  • And when i logout , will it still run on background?
    – RanZilber
    Jan 29, 2012 at 9:59
0

Also be aware when making aplications with:

  update-rc.d myscript defaults 

To have permissions 0755 and to use or get before your .sh the path. Let's say your script is on /root/test.sh , you should first change to CD /root/ before accessing test.sh.

So best way is to make a SH on init.d and there change the path to your sh and execute it in the start function.

0

Simple startup scripts with Java version checking for Linux auth-agent and Windows auth-agent.bat

0

The easiest way is to use supervisord. Please see full details at http://supervisord.org/

You can also view more details here:

Running an executable jar file when the system starts

https://www.digitalocean.com/community/tutorials/how-to-install-and-manage-supervisor-on-ubuntu-and-debian-vps

0

I prefer systemd service and this is a sample for Quarkus application startup service and this is like any java application.

  1. go to /etc/systemd/system

  2. create Quarkus.service file

  3. fill the file like this example.

    [Unit]
Description=Quarkus Application
Wants=syslog.target network.target remote-fs.target
After=remote-fs.target
Before=multi-user.target
[Service]
User=test
LimitNOFILE=102642
Environment="QUARKUS_MAILER_PASSWORD=password1"
Environment="QUARKUS_DATASOURCE_USERNAME=password2"
Environment="QUARKUS_DATASOURCE_PASSWORD=password3"
ExecStart=/usr/lib/jvm/java-11-openjdk/bin/java -jar /path/to/jar file/target/quarkus-app/quarkus-run.jar
ExecStop=/bin/kill -15 $MAINPID
Type = simple
[Install]
WantedBy=multi-user.target
  1. type systemctl daemon-reload
  2. systemctl enable quarkus.service
  3. systemctl start quarkus.service

source

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .