Skip to content

Instantly share code, notes, and snippets.

@aitseitz
Last active January 17, 2025 15:32
Show Gist options
  • Save aitseitz/47b460fb20066d2d88f20ad6d192b937 to your computer and use it in GitHub Desktop.
Save aitseitz/47b460fb20066d2d88f20ad6d192b937 to your computer and use it in GitHub Desktop.
Alfresco & Systemd "best practices"

Systemd Config for Alfresco Content-Services (ACS)

Systemd Unit file located at

/etc/systemd/system/acs.service

[Unit]
Description=Alfresco Content Services (ACS)
Requires=network.target local-fs.target
After=network.target local-fs.target
Before=ass.service

[Service]
Type=forking

User=alfresco01
Group=alfresco

LimitNOFILE=65536

WorkingDirectory=/home/alfresco01/log
ExecStart={{ tomcat_home }}/bin/startup.sh
ExecStop={{ tomcat_home }}/bin/shutdown.sh
# After ExecStart check whether alfresco is started (prevents ass-service to start to early)
ExecStartPost={{ tomcat_home }}/bin/check_acs_startup.sh

# PID File required for Monitoring
PIDFile=/home/alfresco01/content-services/tomcat/catalina.pid
Restart=no

# Give a reasonable amount of time for the server to start up/shut down
TimeoutSec=600
SuccessExitStatus=143

[Install]
WantedBy=multi-user.target

The check_acs_startup.sh is a best practise to prevent the ASS service to start before ACS is up and running and therefore produces ERROR messages in the solr.log

Check_acs_startup.sh - Option wait for /alfresco url"

In this case the check_acs_startup.sh* checks for the /alfresco url to become availble...

#!/usr/bin/bash
# Check Startup from ACS Tomcat for port 8080 so that alfresco webapp is loaded
# echo "check tomcat server startup"
until curl --silent --fail http://127.0.0.1:8080/alfresco/ > /dev/null; do
#    echo "wait...";
    sleep 10;
done
#echo "jeepi, Tomcat server with Alfresco is ready"

exit 0;

Check_acs_startup.sh - Option wait for "Server startup""

In this case the check_acs_startup.sh* checks for the "Server statup" message in the catalina.log file and ensures that all webapps are loaded until ASS service starts. This can be useful in case there are bootstrap mechanism of custom webapps that can lead to indexing problems if solr starts to early bevore alfresco does. If the check_acs_startup.sh* Script can't find the "Server statup" message in a certain amount of time it makes finishes itself to let ass start anyways. Bootstrap problems of 3rd party webapps who are done after alfresco start can be handled that way.

#!/usr/bin/bash

# Check Startup by Searching for "Server startup" in catalina.log
catalina_log_file="{{ tomcat_log_dir }}/catalina.log"
search_string="Server startup"
retries="{{ tomcat_check_startup_retries | default('15') }}"
delay_seconds="{{ tomcat_check_startup_delay_seconds | default('20') }}"

for ((i=1; i<=$retries; i++)); do
  if tail -n200 "$catalina_log_file" | grep "$search_string"; then
    echo "Server startup message found in catalina.log"
    break
  else
    echo "Server startup message not found in catalina.log (Retry $i of $retries)"
    if [ $i -eq $retries ]; then
      echo "Maximum retries reached. Exiting..."
      exit 1
    fi
    sleep "$delay_seconds"
  fi
done

Systemd Config for ActiveMQ Service (AQS)

Systemd Unit file located at

/etc/systemd/system/activemq.service

[Unit]
Description=Apache ActiveMQ service
Requires=network.target local-fs.target
After=syslog.target network.target

[Service]
Type=forking

User=activemq01
Group=alfresco

LimitNOFILE=65536

WorkingDirectory={{ activemq_logs }}
ExecStart={{ activemq_home }}/activemq/bin/activemq start
ExecStop={{ activemq_home }}/activemq/bin/activemq stop
Restart=on-failure

[Install]
WantedBy=multi-user.target

Systemd Config for Alfresco Search-Services (Solr)

Systemd Unit file located at

/etc/systemd/system/ass.service

[Unit]
Description=Alfresco Search Services (ASS)
Requires=network.target local-fs.target
Wants=acs.service
After=network.target activemq.service ats-aio.service acs.service

[Service]
Type=forking

User=solr01
Group=alfresco

LimitNOFILE=65536

WorkingDirectory={{ ass_log_dir }}
Environment=SOLR_INCLUDE={{ ass_home }}/solr.in.sh
Environment=JAVA_HOME={{ java_jdk_ass_host_path }}

# Note: Solr core creation is only done if necessary in solr.in.sh instead of each startup
ExecStart={{ ass_home }}/solr/bin/solr start
ExecStop={{ ass_home }}/solr/bin/solr stop -all
ExecReload={{ ass_home }}/solr/bin/solr restart

#ExecReload=/bin/kill -s HUP $MAINPID
Restart=on-failure

TimeoutSec=120

SuccessExitStatus=143

[Install]
WantedBy=multi-user.target

Systemd Config for Alfresco Transform Services - Custom T-Engine

This is an example of how a custom Alfresco Transform Engine (T-Engine) can be handled

Systemd Unit is located unter

/etc/systemd/system/ats-ate-custom.service

[Unit]
Description=ATS - Alfresco Transform Engine (ATE) - CUSTOM DOKUMENT T-Engine (Aspose)
Requires=network.target local-fs.target
After=syslog.socket network.target local-fs.target activemq.service

[Service]
Type=forking

User=transformer01
Group=alfresco

LimitNOFILE=65536

WorkingDirectory={{ ats_log_dir }}
ExecStart={{ ats_home }}/ats-ate-custom.sh start
ExecStop={{ ats_home }}/ats-ate-custom.sh stop

# PID File required for Monitoring
PIDFile={{ ats_home }}/ats-ate-custom.pid

Restart=no
TimeoutSec=120

SuccessExitStatus=143

[Install]
WantedBy=multi-user.target

ats-ate-custom.sh

#!/bin/bash
# Scripts starts Transform-Services - Alfresco Transform Engine Custom
if [ $(id -u) -eq 0 ]; then
    echo "This script must not be executed by root"
    exit
fi

SCRIPT_NAME=$0
# Remove file ending from basename
SCRIPT_NAME=$(basename "${SCRIPT_NAME%.*}")

# Source Variables
.  "{{ ats_home }}/transform-services_env.sh"

### ATS - T-Engine Custom (Aspose) Configs: ###
export JAVA_OPTS="${JAVA_OPTS} -DSERVER_PORT=${TRANSFORMER_PORT_CUSTOM_DOKUMENT}"
export JAVA_OPTS="${JAVA_OPTS} -DACTIVEMQ_URL=${ACTIVEMQ_URL}"
export JAVA_OPTS="${JAVA_OPTS} -DFILE_STORE_URL=${FILE_STORE_URL}"
# Temp Directory for transformations
export JAVA_OPTS="${JAVA_OPTS} -Djava.io.tmpdir={{ ats_sfs_data }}"
# Aspose License File:
export JAVA_OPTS="${JAVA_OPTS} -DASPOSE_LICENSE_URL=file:path/to/{{ _aspose_license | basename}}"
# Enable for remote debugging:
#export JAVA_OPTS="${JAVA_OPTS} -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:8405"
export JAVA_OPTS="${JAVA_OPTS} {{ ats_ate_custom_java_opts }}"

# Locale Settings Aspose Transformation
export JAVA_OPTS="${JAVA_OPTS} -Dfile.encoding=UTF-8 -Duser.country=DE -Duser.region=DE -Duser.language=de"

# Log-Level:
export JAVA_OPTS="${JAVA_OPTS} -Dlogging.level.com.company.custom.transformer.dokument=warn"

caseStart() {
	if test -f "${ATS_HOME}/$SCRIPT_NAME.pid" ; then
		echo "$SCRIPT_NAME is already running."
		exit 1
	fi
	echo "Starting $SCRIPT_NAME ..."
	cd "${ATS_HOME}" || exit
	nohup "${JAVA_HOME}"/bin/java ${JAVA_OPTS} -jar "${ATS_HOME}/custom-t-engines/{{ custom-tengine_jar }}" \
		>> "${ATS_LOG_DIR}/$SCRIPT_NAME.log" 2>&1 &
	echo $! > "${ATS_HOME}/$SCRIPT_NAME.pid"
	echo "Started $SCRIPT_NAME."
}

caseStop() {
	if test -f "${ATS_HOME}/$SCRIPT_NAME.pid" ; then
		PID=$(cat "${ATS_HOME}/$SCRIPT_NAME.pid")
		echo "Stopping $SCRIPT_NAME ..."
		kill "${PID}" 2> /dev/null
		sleep 5
		kill -9 "${PID}" 2> /dev/null
		rm "${ATS_HOME}/$SCRIPT_NAME.pid"
		echo "Stopped $SCRIPT_NAME."
	else
		echo "$SCRIPT_NAME is not running."
		exit 1
	fi
}

case "$1" in
	start)
		caseStart
		;;
	stop)
		caseStop
		;;
	restart)
		caseStop
		caseStart
		;;
    status)
        if test -f "${ATS_HOME}/$SCRIPT_NAME.pid" ; then
            echo "$SCRIPT_NAME is running."
        else
            echo "$SCRIPT_NAME is stopped."
        fi
        ;;
	*)
		echo "Usage: $0 start|stop|restart"
		;;
esac

Systemd Config for Alfresco Transform Services (ATS) - Option 1

This shows the approach to handle Alfresco Transform Services with only one Systemd Unit File to start & stop all Transformers.

Systemd Unit file located at

/etc/systemd/system/ass-all.service

[Unit]
Description=Alfresco Transform Service
After=syslog.target network.target activemq.service

[Service]
Type=simple

LimitNOFILE=65536

User=trasnformer01
Group=alfresco

WorkingDirectory=/opt/alfresco/content-services/app/transform-services
ExecStart=/opt/alfresco/content-services/app/transform-services/ats_start-stop.sh
startExecStop=/opt/alfresco/content-services/app/transform-services/ats_start-stop.sh
stopSuccessExitStatus=0

[Install]
WantedBy=multi-user.target

ats_start-stop.sh

#!/bin/bash

cd $(dirname $0)
CURDIR=$(pwd)

#IMAGEMAGICK_INSTALL_DIR=/opt/imagemagick
IMAGEMAGICK_INSTALL_DIR=/usr/local
LIBREOFFICE_INSTALL_DIR=/opt/alfresco/content-services/app/libreoffice
ALFRESCO_PDF_RENDERER_INSTALL_DIR=$CURDIR/alfresco-pdf-renderer
JAVA_BIN=/opt/alfresco/content-services/app/java/bin

function usage() {
  echo "Call Script with one of the following params:"
  echo ""
  echo "  start - start all Transformation-Services"
  echo "  stop  - stop all Transformation-Services"
  echo "  usage - show this help"
  exit 1
}

case $1 in
  "start")
    p="alfresco-shared-file-store-controller"
    COUNT=$(ps aux | egrep "java.*$p.*[.]jar" | grep -cv grep)
    if [ $COUNT -gt 0 ]
    then
      echo "$p is already running"
    else
      echo "starting $p"
      nohup ${JAVA_BIN}/java -DfileStorePath=/tmp/Alfresco \
        -jar ${CURDIR}/alfresco-shared-file-store-controller-1.5.3.jar > ${CURDIR}/logs/alfresco-shared-file-store-controller.log 2>&1 &
    fi

    p="alfresco-transform-core-aio-boot"
    COUNT=$(ps aux | egrep "java.*$p.*[.]jar" | grep -cv grep)
    if [ $COUNT -gt 0 ]
    then
      echo "$p is already running"
    else
      echo "starting $p"
      nohup ${JAVA_BIN}/java -DPDFRENDERER_EXE="${ALFRESCO_PDF_RENDERER_INSTALL_DIR}/alfresco-pdf-renderer" \
        -DLIBREOFFICE_HOME="${LIBREOFFICE_INSTALL_DIR}" \
        -DIMAGEMAGICK_ROOT="${IMAGEMAGICK_INSTALL_DIR}" \
        -DIMAGEMAGICK_DYN="${IMAGEMAGICK_INSTALL_DIR}/lib" \
        -DIMAGEMAGICK_EXE="${IMAGEMAGICK_INSTALL_DIR}/bin/convert" \
        -DACTIVEMQ_URL="failover:(tcp://localhost:61616)?timeout=3000" \
        -DFILE_STORE_URL=http://localhost:8099/alfresco/api/-default-/private/sfs/versions/1/file \
        -jar ${CURDIR}/alfresco-transform-core-aio-boot-2.6.0.jar > ${CURDIR}/logs/alfresco-transform-core-aio-boot.log 2>&1 &
    fi

    p="alfresco-transform-router"
    COUNT=$(ps aux | egrep "java.*$p.*[.]jar" | grep -cv grep)
    if [ $COUNT -gt 0 ]
    then
      echo "$p is already running"
    else
      echo "starting $p"
      nohup ${JAVA_BIN}/java -DCORE_AIO_URL=http://localhost:8090 \
        -DCORE_AIO_QUEUE=org.alfresco.transform.engine.aio.acs \
        -DACTIVEMQ_URL="failover:(tcp://localhost:61616)?timeout=3000" \
        -DFILE_STORE_URL=http://localhost:8099/alfresco/api/-default-/private/sfs/versions/1/file \
        -jar ${CURDIR}/alfresco-transform-router-1.5.3.jar > ${CURDIR}/logs/alfresco-transform-router.log 2>&1 &
    fi
    echo "--- logs ---"
    tail -f ${CURDIR}/logs/*.log
    ;;
  "stop")
    rm -f ${CURDIR}/logs/PIDs2bStopped.tmp
    ps aux | egrep "transform.*jar" | grep -v grep | sed 's|^[^ ]*[ ]*\([0-9]*\) .*$|\1|g' >> ${CURDIR}/logs/PIDs2bStopped.tmp
    ps aux | egrep "soffice.bin" | grep -v grep | sed 's|^[^ ]*[ ]*\([0-9]*\) .*$|\1|g' >> ${CURDIR}/logs/PIDs2bStopped.tmp
    i=99
    while [ $(grep -c "" ${CURDIR}/logs/PIDs2bStopped.tmp) -gt 0 ]
    do
      i=$(( i + 1))
      if [ $i -gt 5 ]
      then
        cat ${CURDIR}/logs/PIDs2bStopped.tmp | sed 's|^\([0-9]*\)$|echo "stopping \1" \&\& kill \1|g' | sh
        i=0
      fi
      sleep 1
      rm ${CURDIR}/logs/PIDs2bStopped.tmp
      ps aux | egrep "transform.*jar" | grep -v grep | sed 's|^[^ ]*[ ]*\([0-9]*\) .*$|\1|g' >> ${CURDIR}/logs/PIDs2bStopped.tmp
      ps aux | egrep "soffice.bin" | grep -v grep | sed 's|^[^ ]*[ ]*\([0-9]*\) .*$|\1|g' >> ${CURDIR}/logs/PIDs2bStopped.tmp
    done
    rm ${CURDIR}/logs/PIDs2bStopped.tmp
    ;;
  "status")
    PROCESSES="alfresco-shared-file-store-controller alfresco-transform-core-aio-boot alfresco-transform-router"
    for p in $PROCESSES
    do
      COUNT=$(ps aux | egrep "java.*$p.*[.]jar" | grep -cv grep)
      if [ $COUNT -eq 1 ]
      then
        echo "OK: \"$p\" is running"
        ps aux | egrep "java.*$p.*[.]jar" | grep -v grep | sed 's|^[^ ]*[ ]*\([0-9]*\) .*$| - PID: \1|g'
      elif [ $COUNT -eq 0 ]
      then
        echo "NOK: \"$p\" is not running"
      else
        echo "ERROR: \"$p\" is running more than once:"
        ps aux | egrep "java.*$p.*[.]jar" | grep -v grep | sed 's|^[^ ]*[ ]*\([0-9]*\) .*$| - PID: \1|g'
      fi
    done

    p=soffice.bin
    COUNT=$(ps aux | egrep "$p" | grep -cv grep)
    if [ $COUNT -eq 1 ]
    then
      echo "OK: \"$p\" is running"
      ps aux | egrep "$p" | grep -v grep | sed 's|^[^ ]*[ ]*\([0-9]*\) .*$| - PID: \1|g'
    elif [ $COUNT -eq 0 ]
    then
      echo "NOK: \"$p\" is not running"
    else
      echo "ERROR: \"$p\" is running more than once:"
      ps aux | egrep "$p" | grep -v grep | sed 's|^[^ ]*[ ]*\([0-9]*\) .*$| - PID: \1|g'
    fi

    ;;
  logs)
    tail -f ${CURDIR}/logs/*.log
    ;;
  *)
    usage
    ;;

esac

Systemd Config for Alfresco Transform Services (ATS) Option 2

This is my perfered way and shows approach to handle Alfresco Transform Services with a separate Systemd Unit File for each ATS Component like Transform-Core, Transform-Router, Shared-File-Store

Overview:

ATS Component Overview

Systemd Unit for Transform-Router

is located unter

/etc/systemd/system/ats-atr.service

[Unit]
Description=ATS - Alfresco Transform Router
Requires=network.target local-fs.target
After=syslog.socket network.target local-fs.target activemq.service

[Service]
Type=simple

LimitNOFILE=65536

User=transformer01
Group=alfresco

WorkingDirectory={{ ats_home }}
ExecStart={{ ats_home }}/ats-atr.sh

Restart=no

[Install]
WantedBy=multi-user.target

ats-atr.sh:

#!/bin/bash
# Scripts starts Transform-Services - Alfresco-Transform-Router (ATR)
if [ $(id -u) -eq 0 ]; then
    echo "This script must not be executed by root"
    exit
fi

# Source Variables
.  "{{ ats_home }}/transform-services_env.sh"

export JAVA_OPTS="${JAVA_OPTS} -DCORE_AIO_URL={{ ats_aio_url }}"
export JAVA_OPTS="${JAVA_OPTS} -DCORE_AIO_QUEUE=org.alfresco.transform.engine.aio.acs"
export JAVA_OPTS="${JAVA_OPTS} -DACTIVEMQ_URL=${ACTIVEMQ_URL}"
export JAVA_OPTS="${JAVA_OPTS} -DFILE_STORE_URL={{ ats_sfs_url }}/alfresco/api/-default-/private/sfs/versions/1/file"

# Temp Directory for ATR
export JAVA_OPTS="$JAVA_OPTS -Djava.io.tmpdir={{ ats_sfs_data }}"

export JAVA_OPTS="${JAVA_OPTS} {{ ats_atr_java_opts }}"
cd "${ATS_HOME}" || exit

exec ${JAVA_HOME}/bin/java ${JAVA_OPTS} -jar ${ATS_HOME}/alfresco-transform-router-*.jar >> ${ATS_LOG_DIR}/ats-atr.log

Systemd Unit for Transform-Shared-File-Storage

is located unter

/etc/systemd/system/ats-sfs.service

[Unit]
Description=ATS - Alfresco Shared File Store
Requires=network.target local-fs.target
After=syslog.socket network.target local-fs.target

[Service]
Type=simple

User=transformer01
Group=alfresco

WorkingDirectory={{ ats_home }}
ExecStart={{ ats_home }}/ats-sfs.sh

Restart=no

[Install]
WantedBy=multi-user.target

ats-sfs.sh

#!/bin/sh
# Scripts starts Transform-Services - Shared File Store (SFS)
if [ $(id -u) -eq 0 ]; then
    echo "This script must not be executed by root"
    exit
fi

# Source Variables
.  "{{ ats_home }}/transform-services_env.sh"

export JAVA_OPTS="$JAVA_OPTS -Dscheduler.content.age.millis={{ ats_sfs_scheduler_content_age_millis | default ('86400000') }}"
export JAVA_OPTS="$JAVA_OPTS -Dscheduler.cleanup.interval={{ ats_sfs_scheduler_cleanup_interval | default ('86400000') }}"
export JAVA_OPTS="$JAVA_OPTS -Dscheduler.contract.path={{ ats_sfs_data }}/../scheduler.json"
export JAVA_OPTS="$JAVA_OPTS -DfileStorePath={{ ats_sfs_data }}"
# SFS Log-Level:
export JAVA_OPTS="$JAVA_OPTS -Dlogging.level.org.alfresco.store=warn"

# Temp Directory for SFS
export JAVA_OPTS="$JAVA_OPTS -Djava.io.tmpdir={{ ats_sfs_data }}"

#export JAVA_OPTS="-Xms128m -Xmx512m $JAVA_OPTS"
export JAVA_OPTS="$JAVA_OPTS {{ ats_sfs_java_opts }}"
cd "${ATS_HOME}" || exit
${JAVA_HOME}/bin/java ${JAVA_OPTS} -jar ${ATS_HOME}/alfresco-shared-file-store-*.jar >> ${ATS_LOG_DIR}/ats-shared-fs.log

Systemd Unit for Transform Core T-Engine (ALL-IN-ONE Transformer)

is located unter

/etc/systemd/system/ats-ate-aio.service

[Unit]
Description=ATS - Alfresco Transform Engine (ATE) - All-In-One (AIO)
Requires=network.target local-fs.target
After=syslog.socket network.target local-fs.target activemq.service

[Service]
Type=simple

LimitNOFILE=65536

User=transformer01
Group=alfresco

WorkingDirectory={{ ats_home }}
ExecStart={{ ats_home }}/ats-ate-aio.sh
ExecStopPost={{ ats_home }}/ats-ate-aio-exec-stop-post.sh

# Set appropriate KillMode and KillSignal
KillMode=process
KillSignal=SIGTERM

TimeoutSec=120

Restart=no
SuccessExitStatus=143

[Install]
WantedBy=multi-user.target

ats-ate-aio.sh

#!/bin/bash
# Scripts starts Transform-Services - Alfresco-Transform-Core-AIO (ATR)
# AIO = All in One
if [ $(id -u) -eq 0 ]; then
    echo "This script must not be executed by root"
    exit
fi

# Source Variables
.  "{{ ats_home }}/transform-services_env.sh"

### ATS - T-Engine AIO (All in One) Configs: ###

# Alfresco PDF Renderer
export JAVA_OPTS="${JAVA_OPTS} -DPDFRENDERER_EXE={{ ats_alfresco_pdf_renderer_exe }}"

# Libreoffice Configs
export JAVA_OPTS="${JAVA_OPTS} -DLIBREOFFICE_HOME=${LIBREOFFICE_HOME} \
  -DLIBREOFFICE_PORT_NUMBERS=${LIBREOFFICE_PORT_NUMBERS} \
  -DLIBREOFFICE_MAX_TASKS_PER_PROCESS=${LIBREOFFICE_MAX_TASKS_PER_PROCESS} \
  -DLIBREOFFICE_TIMEOUT=${LIBREOFFICE_TIMEOUT}"

# ImageMagick Configs
export JAVA_OPTS="${JAVA_OPTS} -DIMAGEMAGICK_ROOT=${IMAGEMAGICK_HOME} \
  -DIMAGEMAGICK_DYN=${IMAGEMAGICK_DYN} \
  -DIMAGEMAGICK_EXE=${IMAGEMAGICK_EXE} \
  -DIMAGEMAGICK_CONFIG=${IMAGEMAGICK_CONFIG} \
  -DIMAGEMAGICK_CODERS=${IMAGEMAGICK_CODERS}"

# ActiveMQ
#export JAVA_OPTS="${JAVA_OPTS} -DACTIVEMQ_URL=failover:(tcp://10.0.2.15:61616)?timeout=3000"
export JAVA_OPTS="${JAVA_OPTS} -DACTIVEMQ_URL=${ACTIVEMQ_URL}"

# Shared File Store
export JAVA_OPTS="${JAVA_OPTS} -DFILE_STORE_URL={{ ats_sfs_url }}/alfresco/api/-default-/private/sfs/versions/1/file"

# Temp Directory AIO for Libreoffice, Imagemagick & Tika transformations
export JAVA_OPTS="$JAVA_OPTS -Djava.io.tmpdir={{ ats_sfs_data }}"

# Log Level:
export JAVA_OPTS="$JAVA_OPTS -Dlogging.level.org.alfresco.transformer.metadataExtractors=warn"

# JAVA Environment Settings:
export JAVA_OPTS="${JAVA_OPTS} {{ ats_aio_java_opts }}"
cd "${ATS_HOME}" || exit

# Starting Transformer AIO
# exec = Java process directly take over the shell process and have signals like SIGINT (Ctrl+C) forwarded to the Java process
exec ${JAVA_HOME}/bin/java ${JAVA_OPTS} -jar ${ATS_HOME}/alfresco-transform-core-aio-boot-*.jar >> ${ATS_LOG_DIR}/ats-ate-aio.log

Reminder: Don't forget to adjust the german LANG Settings for Libreoffice in .bashrc to have correct Date Format in Alfresco Renditions (Document Previews)

# Language settings for Libreoffice
export LANG=de_DE.UTF-8

ats-ate-aio-exec-stop-post.sh

#!/bin/bash
# ExecStopPost Script for Transform-Services - Alfresco-Transform-Core-AIO
# AIO = All in One
# This Scripts handles the termination of the AIO Child processes.
# In particular it terminates all soffice.bin processes

if [ $(id -u) -eq 0 ]; then
    echo "This script must not be executed by root"
    exit
fi

# Function to kill all soffice.bin child processes
kill_soffice_processes() {
  soffice_pids=$(ps -ef | egrep "soffice.bin" | grep -v grep | sed 's|^[^ ]*[ ]*\([0-9]*\) .*$|\1|g')

  for soffice_pid in $soffice_pids; do
    soffice_pid_name=$(ps -p "${soffice_pid}" -o comm=)
    echo "killing process ${soffice_pid_name} with process id ${soffice_pid}"
    kill "${soffice_pid}"
  done
}

kill_soffice_processes

exit 0

==> The Script ats-ate-aio_exec_stop_post.sh is my best practise to ensure that all libreoffice "soffice.bin" child processes which are generated by alfresco-transform-core-aio-boot-*.jar are terminated once the systemd service for transform-core AIO receives the SIGTERM signal (shutdown).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment