xinetd не может запустить lighttpd

Вы могли загрузить их в массив и считать его назад:

awk '{x[i++]=$0} END{for (j=i-1; j>=0;) print x[j--] }'

Вы могли сделать это более эффективно, но это отчасти иллюстрирует почему awk не правильный инструмент для этого. Продолжите использовать tac где это возможно, GNU tac является обычно самым быстрым из множества инструментов для этого задания.

2
29.11.2013, 13:31
1 ответ

Не делайте этого этот путь, работайте lighttpd строго как демон. Демон xinetd является средним для запуска сервисов, которые на самом деле не работают все время. Когда xinetd видит трафик, он "вращает" конкретный сервис для удовлетворения потребностей, но иначе процессы не работают.

Между прочим, Вы не можете совместно использовать порт TCP между 2 демонами/сервисами. Только один сервис может связать с конкретным портом TCP, по существу владея им на время времени, когда он работает.

Выполнение его так или иначе

Если Вы абсолютно уверены, что хотите работать, это как это затем смотрит на это учебное руководство, которое показывает точно этот сценарий на Raspberry Pi. Учебное руководство названо: Запуск mysqld и httpd по требованию с xinetd.

Этот сценарий был создан, /etc/xinetd.init.d/lighttpd:

#!/bin/bash
# inspired on this article
# https://www.linuxnet.ch/automatic-tunnels-with-xinetd-and-netcat/
# script is called from xinetd
# script starts and stops service using /etc/init.d scripts

SERVICE=/etc/init.d/lighttpd  # script used to start/stop service
PORT=81 # port where end service should listen
PID_FILE=/var/run/lighttpd.pid # pid file generated by init script
REAPER_PID_FILE="/var/run/lighttpd_reaper.pid" # pid file generated by this script
REAPER_SLEEP=180 # The reaper sleeps in seconds and checks for idle conns
LOG=/var/log/syslog # where to log messages

# this function checks if we already have reaper
check_reaper(){
        if  [ -s $REAPER_PID_FILE ]
        then
                reaper_pid=`cat $REAPER_PID_FILE 2>/dev/null`
                ps -p $reaper_pid &> /dev/null
                if [ $? -ne 0 ]
                then
                        start_reaper &    # If we don't have a reaper we start one
                        echo $! > $REAPER_PID_FILE
                fi
        else
                start_reaper &
                echo $! > $REAPER_PID_FILE
        fi

}

# this function starts a reaper, which is a background process that will kill the end service if its inactive
start_reaper(){
        while [ -f $PID_FILE ]
        do
                sleep $REAPER_SLEEP                                      # We wait
                touched=`stat --printf %W $REAPER_PID_FILE 2>/dev/null`  # We check when the reaper PID was last touched
                now=`date +%s 2>/dev/null`
                let idle=$now-$touched
                if [ $idle -gt $REAPER_SLEEP ]              # If reaper pid has not been touched in more than a sleep cycle we stop the service
                then
                        echo `date`" REAPER STOPPING SERVICE AFTER BEING $idle" >> $LOG   
                        $SERVICE stop >> $LOG               # This is the stop service instruction
                        rm $REAPER_PID_FILE 
                        exit 0
                fi
        done
}


# This is where we start our service
start_service(){
        sleep 1                    # Added a delay to trouble shoot as browsers kickstart several connections, we need to allow the PID file to be created this can be improved.
        if [ -s $PID_FILE ]        # We check if the PID file for the end service exist to avoid calling the start script when the service has already been started
        then
                return
        else
                echo `date`" STARTING $SERVICE" >> $LOG
                $SERVICE start &>> $LOG                  #this is the start service instruction
                return
        fi
}

# We probe and wait for the service to come on line
wait_for_service(){
        nc -w30 -z 127.0.0.1 $PORT &>/dev/null          # probe end port with a timeout of 30 seconds
        if [[ $? -ne 0 ]]
        then
                echo `date`" XINET SERVICE START ON $PORT TIMED OUT" >> $LOG
        fi
}

# This is were all the magic happens netcat passes traffic back and forth
transmit(){
        nc -w30 127.0.0.1 $PORT 2>/dev/null  # netcat is awesome, timeout flag of 30 seconds can be adjusted
}

# this is the main program that is called every time
main()
{
        nc -z 127.0.0.1 $PORT &>/dev/null  # We probe the end service
        if [[ $? -ne 0 ]]                  # If its not responding
        then
                start_service              # We start service
                wait_for_service           # We wait for service to became online
        fi
        check_reaper                       # We always check we have a reaper
        touch $REAPER_PID_FILE             # We log activity by touching the reaper PID file
        transmit                           # We transmit data 
        exit 0                             
}

main

И следующий xinetd сервис был создан:

service http
{
        disable         = no
        socket_type     = stream
        protocol        = tcp
        port              = 80
        server = /etc/xinetd.init.d/lighttpd
        user            = root
        wait            = no
}
5
27.01.2020, 21:57
  • 1
    , у Нас есть маленькая встроенная система, таким образом, мы были бы, если это возможно, только запускает программы при необходимости. –  JakobJ 29.11.2013, 13:07
  • 2
    @JakobJ - посмотрите обновления. –  slm♦ 29.11.2013, 13:15

Теги

Похожие вопросы