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


48

새로운 시스템 스크립트를 작성하여 올바른 일을하고 싶지 않습니다. 시스템을 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

"나는 옳은 일을하고 싶지 않다"는 것은 당신에게 많은 부정적인 피드백을 줄 것입니다. 위험 복을 입었 으면 좋겠다. 어쨌든 저항이 가장 적은 경로는 아무것도 아닙니다 . init 스크립트를 사용하십시오.
Michael Hampton

6
언젠가는 내가 옳은 일을 할 것입니다. 그러나 우리는 제한된 자원의 세계에 살고 있습니다. 작동하지 않는 것에 대한 자세한 내용을 추가했습니다. 이것은 이미 작동해야하기 때문입니다.
mlissner

우분투에서 이것을하려고합니까? 신은 왜 당신을 도와?
Michael Hampton

1
나는. 다른 곳보다 더 나쁜가요?
mlissner

1
우분투의 다른 실패들 중 하나는 Upstart가 엄청난 악몽 이었다는 것입니다. 그것은 그들이 마침내 그것을 제거지고 있다는 것을 좋다, 그러나 당신의 init 스크립트 와 같이이 그것으로 정말 호환되지 않습니다. 이전의 작동 방식은 (고대) SysV 호환성을 통해 발생했을 가능성이 높으며 systemd가이를 처리 할 수 ​​있지만 Ubuntu는이를 해결하기 위해 무언가를 한 것 같습니다. 특히이 작업에 사용한 것보다 시스템 단위 파일을 작성하는 데 훨씬 적은 시간이 걸리기 때문에이 작업을 수행하지 않는 것이 좋습니다.
Michael Hampton

답변:


34

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

이것은 당신에게 그 길의 약 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는 서비스 이름 아래에 서비스 출력을 자동으로 캡처하고 기록합니다.


5
글쎄, 이것은 하루 종일 조정하고 구성하는 데 모든 것이 필요했습니다. systemd이 스크립트에는 설정하지 않으면 영구 로그가 없습니다. 결국, 그것은 작동하고 있으며 당신의 푸시는 내가 필요한 것입니다. 감사합니다.
mlissner

15

나를 위해 여기에 제안 된대로 헤더에 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.


1
코드에 오타가있어서 내가 가진 것과 똑같아 서 "contains no runlevels, aborting"내가 깨달을 때까지 스크립트가 작동하지 않도록 (따라서 악명 높은 오류가 발생했습니다) 두 번째 줄에 세 번째 #이 누락되었습니다 ( ### BEGIN INIT INFO). 나는 또한 당신이 왜 그렇게 적은 표를 가지고 있는지 설명 할 것입니다.
Pere

1
죄송합니다. 아마도 복사-붙여 넣기 과정에서 제거되었을 것입니다! (지금 수정 됨)
eadmaster

7

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

systemctl daemon-reload  
systemctl enable solr  
systemctl start solr  

1
그는 이미 그것을 시도했지만 우분투는 버그가 있기 때문에 작동하지 않았습니다.
Michael Hampton

4

제공된 시작 스크립트를 사용하여 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환경 변수를 존중하므로 살펴보십시오.


오늘은 괜찮습니다. 질문이 처음 작성된 시점에는 Solr에 대해 제공된 시스템 장치가 없었습니다.
Michael Hampton

1

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

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


또는 SYSTEMCTL_SKIP_REDIRECT=trueredhat에서
Otheus

나를 위해 일하지 않았다 :(
eadmaster

다음 과 같이 _앞에 (밑줄) 을 추가하십시오 . 커맨드 라인에서 시도하면 해당 var를 내 보내야합니다. SYSTEMCTL_SYSTEMCTL_SKIP_REDIRECT=1
timurb

1

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


그것은 내 스크립트의 경우 일 수도 있습니다.
mlissner
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.