# exit code 143

## schmidicom

Beim beenden eines Hintergrunddienst taucht im Log eine Meldung auf bei der ich mir jetzt nicht so ganz sicher bin was ich davon halten soll und hoffentlich kann einer von euch Licht in die Sache bringen.

Über folgendes service File (welches ich selbst geschrieben habe) wird ein Java Programm erfolgreich gestartet:

```
[Unit]

Description=UniFi-Controller

After=network.target

[Service]

Type=simple

ExecStart=/usr/bin/java -jar /opt/UniFi/lib/ace.jar start

ExecStop=/usr/bin/java -jar /opt/UniFi/lib/ace.jar stop

[Install]

WantedBy=multi-user.target
```

Hier der Aufruf auf der Konsole mit Statusanzeige:

```
pc177am UniFi # systemctl start unifi

pc177am UniFi # systemctl status unifi

unifi.service - UniFi-Controller

   Loaded: loaded (/etc/systemd/system/unifi.service; disabled)

   Active: active (running) since Mi 2014-03-19 16:02:21 CET; 11min ago

 Main PID: 967 (java)

   CGroup: /system.slice/unifi.service

           ├─ 967 /usr/lib/jvm//icedtea-7/bin/java -jar /opt/UniFi/lib/ace.jar start

           └─1003 bin/mongod --dbpath /opt/UniFi/data/db --port 27117 --logappend --logpath logs/mongod.log --nohttpinterface --bind_ip 127.0.0.1

Mär 19 16:02:21 pc177am systemd[1]: Started UniFi-Controller.
```

Aber wenn das ganze dann wieder beendet werden soll kommt dass dabei raus:

```
pc177am UniFi # systemctl stop unifi

pc177am UniFi # systemctl status unifi

unifi.service - UniFi-Controller

   Loaded: loaded (/etc/systemd/system/unifi.service; disabled)

   Active: failed (Result: exit-code) since Mi 2014-03-19 16:14:30 CET; 1s ago

  Process: 1106 ExecStop=/usr/bin/java -jar /opt/UniFi/lib/ace.jar stop (code=exited, status=0/SUCCESS)

  Process: 967 ExecStart=/usr/bin/java -jar /opt/UniFi/lib/ace.jar start (code=exited, status=143)

 Main PID: 967 (code=exited, status=143)

Mär 19 16:02:21 pc177am systemd[1]: Started UniFi-Controller.

Mär 19 16:14:29 pc177am systemd[1]: Stopping UniFi-Controller...

Mär 19 16:14:30 pc177am systemd[1]: unifi.service: main process exited, code=exited, status=143/n/a

Mär 19 16:14:30 pc177am systemd[1]: Stopped UniFi-Controller.

Mär 19 16:14:30 pc177am systemd[1]: Unit unifi.service entered failed state.
```

Der Prozess wird zwar beendet aber was mich etwas irritiert sind die Ausgaben "failed" und "(code=exited, status=143)", welche auf der Konsole auch mit roter Schrift hervorgehoben werden.

Kann mir einer sagen ob ich mir deswegen sorgen machen muss?

----------

## Christian99

Das "failed" ist schon eine interpretation des exitcodes. per konvention heißt ein exit code 0 das alles ok ist !=0 heißt, das etwas "unnormal" ist. was "unnormal" ist hängt aber von deinem programm ab. da müsstest du dann mal in der dokumentation deines programmes nachforschen, was dieser exit-code genau bedeutet.

----------

## schmidicom

Die Doku von dieser Java-App gibt leider nicht wirklich viel her, genau genommen ist es nicht einmal eine Doku sondern eher eine Kurzanleitung. Und die sagt einem lediglich wie das Programm gestartet/beendet wird und in welcher Datei die Einstellungen gespeichert sind.

Eine etwas längere Suche ergab das hier: https://community.oracle.com/message/6377073#6377073

Aber wenn das Programm den Rückgabewert selbst bestimmt, kann dieser wohl wirklich alles mögliche bedeuten.

----------

## ChrisJumper

schmidicom,

bestimmt hast du archlinux - systemd - Writing custom .service file schon zumindest überflogen.

Hieraus geht ja folgendes hervor:

 *Quote:*   

> Active: failed (Result: exit-code) since Mi 2014-03-19 16:14:30 CET; 1s ago 
> 
>   Process: 1106 ExecStop=/usr/bin/java -jar /opt/UniFi/lib/ace.jar stop (code=exited, status=0/SUCCESS) 
> 
>   Process: 967 ExecStart=/usr/bin/java -jar /opt/UniFi/lib/ace.jar start (code=exited, status=143) 
> ...

 

Systemd hat mit einem zweiten Kommando das erste herunter gefahren. Daher "stürzt" der Prozess mit dem du dein Programm gestartet hast ab.

Aus deinem Community Oracle Link hebe ich mal folgendes hervor:

 *843810 wrote:*   

> Finally I found my issue. Actually there was an external process which kills this java sub-process and all I can see was 143 exitcode. The -Xrs switch didn`t helped at all.

 

 *843810 wrote:*   

> In my case there was an Anthill agent process which is running Ant.

 

Ich finde das passt ganz gut. Am besten du schaust mal wie das Programm verfährt, ob es selber seine Subroutinen startet und verwaltet. Du kannst es ja auch ein wenig Observieren beim Start in einer Konsole. Forkt es, legt es eine PID-File an. Gibt es Konfigurationen dafür und so weiter. Mit einer PID könntest du das zumindest auch bei Systemd anders lösen. Finden sich weitere Hinweise in der gestarteten jar-Datei oder ein anderer Befehl zum beenden des Prozesses? 

Denke bei deinem Script fehlt noch was oder das ganze ein wenig anpassen. Für Systemd sind die beiden Befehle zum starten und zum Stoppen aber offensichtlich zwei verschiedene Befehle, mit unterschiedlichen Prozessen.

Probiere doch mal Typ=forking vielleicht klappt es auch ohne eine explizite PID. Eventuell verfährt Systemd dann anders mit der erzeugten PID beim ausführen des ExecStop Befehles.

Mir fehlt bei den ganzen uinit Files immer das Ampersend, welches in der Shell den Befehl ja in den Hintergrund legt. Wobei ich auch denke das Systemd dies immer von alleine macht.

----------

## schmidicom

 *ChrisJumper wrote:*   

> Systemd hat mit einem zweiten Kommando das erste herunter gefahren. Daher "stürzt" der Prozess mit dem du dein Programm gestartet hast ab.

 

Sollte es aber nicht denn auf der Konsole muss man das Programm ebenfalls auf diese Weise beenden und da exitet es mit 0 wie man mit strace ziemlich gut sehen kann.

```
....

clone(child_stack=0x7fb688e88ff0, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fb688e899d0, tls=0x7fb688e89700, child_tidptr=0x7fb688e899d0) = 4528

futex(0x7fb688e899d0, FUTEX_WAIT, 4528, NULL) = 0

exit_group(0)                           = ?

+++ exited with 0 +++
```

 *ChrisJumper wrote:*   

> Ich finde das passt ganz gut. Am besten du schaust mal wie das Programm verfährt, ob es selber seine Subroutinen startet und verwaltet. Du kannst es ja auch ein wenig Observieren beim Start in einer Konsole. Forkt es, legt es eine PID-File an. Gibt es Konfigurationen dafür und so weiter. Mit einer PID könntest du das zumindest auch bei Systemd anders lösen. Finden sich weitere Hinweise in der gestarteten jar-Datei oder ein anderer Befehl zum beenden des Prozesses?

 

Ich bin mir jetzt nicht ganz sicher aber wenn pstree sowas anzeigt dann forkt der Prozess wohl wirklich:

```
           ├─konsole(846)─┬─bash(855)───strace(5215)───java(5215)─┬─mongod(5215)─┬─{mongod}(5215)

           │              │                                       │              ├─{mongod}(5215)

           │              │                                       │              ├─{mongod}(5215)

           │              │                                       │              ├─{mongod}(5215)

           │              │                                       │              ├─{mongod}(5215)

           │              │                                       │              ├─{mongod}(5215)

           │              │                                       │              ├─{mongod}(5215)

           │              │                                       │              ├─{mongod}(5215)

           │              │                                       │              ├─{mongod}(5215)

           │              │                                       │              ├─{mongod}(5215)

           │              │                                       │              ├─{mongod}(5215)

           │              │                                       │              ├─{mongod}(5215)

           │              │                                       │              └─{mongod}(5215)

           │              │                                       ├─{java}(5215)

           │              │                                       ├─{java}(5215)

           │              │                                       ├─{java}(5215)

           │              │                                       ├─{java}(5215)

           │              │                                       ├─{java}(5215)

           │              │                                       ├─{java}(5215)

           │              │                                       ├─{java}(5215)

           │              │                                       ├─{java}(5215)

           │              │                                       ├─{java}(5215)

           │              │                                       ├─{java}(5215)

           │              │                                       ├─{java}(5215)

           │              │                                       ├─{java}(5215)

           │              │                                       ├─{java}(5215)

           │              │                                       ├─{java}(5215)

           │              │                                       ├─{java}(5215)

           │              │                                       ├─{java}(5215)

           │              │                                       ├─{java}(5215)

           │              │                                       ├─{java}(5215)

           │              │                                       ├─{java}(5215)

           │              │                                       ├─{java}(5215)

           │              │                                       ├─{java}(5215)

           │              │                                       ├─{java}(5215)

           │              │                                       ├─{java}(5215)

           │              │                                       ├─{java}(5215)

           │              │                                       ├─{java}(5215)

           │              │                                       ├─{java}(5215)

           │              │                                       ├─{java}(5215)

           │              │                                       ├─{java}(5215)

           │              │                                       ├─{java}(5215)

           │              │                                       ├─{java}(5215)

           │              │                                       ├─{java}(5215)

           │              │                                       ├─{java}(5215)

           │              │                                       ├─{java}(5215)

           │              │                                       ├─{java}(5215)

           │              │                                       ├─{java}(5215)

           │              │                                       ├─{java}(5215)

           │              │                                       ├─{java}(5215)

           │              │                                       └─{java}(5215)
```

Ich werde das Servicefile mal auf forking umstellen und sehen was dann passiert.

Zum verhalten der Java-App möchte ich noch sagen das sie sich auch auf der Konsole nicht von selbst in den Hintergrund versetzt, sie verhält sich eher wie cp, rm und so weiter.

Hier noch die wirklich sehr kurze Kurzanleitung: http://shschmid.dyndns.ch/owncloud/public.php?service=files&t=94d39bab068ebc4fb7dd05fadd9132d1  :Wink: 

EDIT:

Also das mit dem forking in der service Datei war keine gute Idee dann versucht systemd ewig das Programm zu starten bis irgendwann ein Timeout alles abwürgt. Mal sehen ob sich im Forum von UniFi eine bessere Möglichkeit finden lässt dieses Ding zu starten oder zumindest mal eine Auflistung welche Kommandos die ace.jar kennt.

----------

