이전 init 스크립트를 systemd에서 작동시키는 가장 쉬운 방법은 무엇입니까? start solr Failed

새로운 시스템 스크립트를 작성하여 올바른 일을하고 싶지 않습니다. 시스템을 systemd를 사용하는 OS로 시스템을 업그레이드 했으므로 이전 init 스크립트가 다시 작동하기를 원합니다.

init 스크립트를 변환하는 방법과 시스템 스크립트를 작성하는 방법에 대해 간략히 연구했지만 제대로 학습하고 올바르게 수행하는 데 몇 시간이 걸릴 것입니다.

현재 상황은 다음과 같습니다

systemctl start solr
Failed to start solr.service: Unit solr.service failed to load: No such file or directory.

과:

sudo service solr start
Failed to start solr.service: Unit solr.service failed to load: No such file or directory.

지금은 일을 다시하고 싶습니다. 이 작업을 다시 수행하는 데 가장 저항 이 적은 경로는 무엇입니까 ?

업데이트

나는이 모든 것을 알아 내고 싶지 않았다 – 나는 정말로하지 않았다 – 그러나 나는 나의 첫 번째 단서를 찾아 내야했다.

sudo systemctl enable solr
Synchronizing state for solr.service with sysvinit using update-rc.d...
Executing /usr/sbin/update-rc.d solr defaults
insserv: warning: script 'K01solr' missing LSB tags and overrides
insserv: warning: script 'solr' missing LSB tags and overrides
Executing /usr/sbin/update-rc.d solr enable
update-rc.d: error: solr Default-Start contains no runlevels, aborting.

systemd비 호환성 페이지 는 다음과 같이 말합니다.

LSB 헤더 종속성 정보가 중요합니다. 많은 배포판에서 SysV 구현은 LSB 초기화 스크립트 헤더로 인코딩 된 종속성 정보를 사용하지 않았거나 매우 제한된 방식으로 만 사용했습니다. 그로 인해 종종 부정확하거나 불완전합니다. systemd 그러나 이러한 헤더를 완전히 해석하고 런타임에 밀접하게 따라갑니다.

나는 그것이 수정 될 때까지 내 스크립트가 작동하지 않는다는 것을 의미한다고 생각합니다.

문제의 스크립트 :

#!/bin/sh

# Prerequisites:
# 1. Solr needs to be installed at /usr/local/solr/example
# 2. daemon needs to be installed
# 3. Script needs to be executed by root
# 4. $INSTALL_ROOT must be set

# This script will launch Solr in a mode that will automatically respawn if it
# crashes. Output will be sent to /var/log/solr/solr.log. A pid file will be
# created in the standard location.

start () {
    echo -n "Starting solr..."

    # Reset ulimit or else get issues with too many open files (https://issues.apache.org/jira/browse/SOLR-4)
    ulimit -n 10000

    # start daemon
    daemon --chdir='/usr/local/solr/example' --command "java -jar -server start.jar -DINSTALL_ROOT=$INSTALL_ROOT" --respawn --output=/var/log/solr/solr.log --name=solr --verbose

    RETVAL=$?
    if [ $RETVAL = 0 ]
    then
        echo "done."
    else
        echo "failed. See error code for more information."
    fi
    return $RETVAL
}

stop () {
    # stop daemon
    echo -n "Stopping solr..."

    daemon --stop --name=solr  --verbose
    RETVAL=$?

    if [ $RETVAL = 0 ]
    then
        echo "done."
    else
        echo "failed. See error code for more information."
    fi
    return $RETVAL
}


restart () {
    daemon --restart --name=solr  --verbose
}


status () {
    # report on the status of the daemon
    daemon --running --verbose --name=solr
    return $?
}


case "$1" in
    start)
        start
    ;;
    status)
        status
    ;;
    stop)
        stop
    ;;
    restart)
        stop
        sleep 15
        start
    ;;
    *)
        echo $"Usage: solr {start|status|stop|restart}"
        exit 3
    ;;
esac

exit $RETVAL



답변

실제로 시스템 단위 파일은 이와 같은 서비스 또는 대부분의 서비스에 대해 작성하기가 쉽지 않습니다.

이것은 당신에게 그 길의 약 95 %를 가져와야합니다. 예를 들어/etc/systemd/system/solr.service

[Unit]
Description=Apache Solr
After=syslog.target network.target remote-fs.target nss-lookup.target

[Service]
Type=simple
EnvironmentFile=/etc/courtlistener
WorkingDirectory=/usr/local/solr/example
ExecStart=/usr/bin/java -jar -server -Xmx${CL_SOLR_XMX} start.jar -DINSTALL_ROOT=${INSTALL_ROOT}
Restart=on-failure
LimitNOFILE=10000

[Install]
WantedBy=multi-user.target

로그 파일과 같이 여기에 없는 것들에 유의하십시오 . systemd는 서비스 이름 아래에 서비스 출력을 자동으로 캡처하고 기록합니다.


답변

나를 위해 여기에 제안 된대로 헤더에 init info 블록을 추가하는 것이 더 쉬웠 습니다 .

#!/bin/sh
### BEGIN INIT INFO
# Provides:          solr
# Required-Start:
# Required-Stop:
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: solr
# Description:       solr
### END INIT INFO

그런 다음를 실행하십시오 sudo systemctl enable solr.


답변

systemd와 함께 solr legacy init 스크립트를 사용하는 또 다른 솔루션 :

systemctl daemon-reload
systemctl enable solr
systemctl start solr


답변

제공된 시작 스크립트를 사용하여 Solr을 실행하는 것이 더 편리합니다 .

시스템 단위 파일은 다음과 같습니다.

[Unit]
Description=Apache Solr for Nextcloud's nextant app fulltext indexing
After=syslog.target network.target remote-fs.target nss-lookup.target systemd-journald-dev-log.socket
Before=nginx.service

[Service]
Type=forking
User=solr
WorkingDirectory=/path/to/solr/server
ExecStart=/path/to/solr/bin/solr start
ExecStop=/path/to/solr/bin/solr stop
Restart=on-failure

[Install]
WantedBy=multi-user.target

당신은 또한 추가하여 환경 변수의 사용을 할 수 있습니다 EnvironmentFile받는 [Service]부분. 스크립트는 bin/solr환경 변수를 존중하므로 살펴보십시오.


답변

데비안에서 테스트 : 스크립트 시작시 ‘_SYSTEMCTL_SKIP_REDIRECT = OHYES’를 추가하십시오.

체계적인 팬 보이는 마음에 들지 않지만, 나는 체계화 된 것을 좋아하지 않기 때문에 :).


답변

CentOS 7에서 LSB init 스크립트를 사용하는 동안 동일한 오류가 발생했습니다. 근본 원인은 스크립트가 심볼릭 링크 인 것으로 밝혀졌습니다. 일단 원본의 사본으로 교체되면 모든 것이 잘 작동했습니다.


답변