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.

RanZilber
  • 393
  • 1
  • 4
  • 5

7 Answers7

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.

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/

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.

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

Mohannd
  • 161
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