Cách dễ nhất để làm cho tập lệnh init cũ của tôi hoạt động trong systemd là gì?


48

Tôi không muốn làm điều đúng bằng cách tạo tập lệnh systemd mới, tôi chỉ muốn tập lệnh init cũ của tôi hoạt động trở lại khi tôi đã nâng cấp hệ thống của mình lên HĐH sử dụng systemd.

Tôi đã nghiên cứu ngắn gọn về cách chuyển đổi các tập lệnh init và cách viết tập lệnh systemd, nhưng tôi chắc chắn việc học nó đúng cách và thực hiện đúng sẽ khiến tôi mất vài giờ.

Tình hình hiện tại là:

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

Và:

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

Ngay bây giờ, tôi chỉ muốn trở lại làm việc. Con đường ít kháng cự nhất để làm việc này trở lại là gì?

Cập nhật

Tôi không muốn tìm hiểu tất cả - tôi thực sự đã không - nhưng tôi phải làm và tôi đã khai quật được manh mối đầu tiên của mình:

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.

Các trang không tương thích cho systemd nói rằng:

LSB tiêu đề phụ thuộc thông tin vấn đề. Việc triển khai SysV trên nhiều bản phân phối đã không sử dụng thông tin phụ thuộc được mã hóa trong các tiêu đề tập lệnh khởi tạo LSB hoặc chỉ sử dụng chúng theo những cách rất hạn chế. Do đó chúng thường không chính xác hoặc không đầy đủ. systemd tuy nhiên diễn giải đầy đủ các tiêu đề này và theo dõi chúng chặt chẽ trong thời gian chạy

Tôi nghĩ điều đó có nghĩa là kịch bản của tôi sẽ không hoạt động cho đến khi nó được sửa.

Kịch bản trong câu hỏi:

#!/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

"Tôi không muốn làm điều đúng đắn" sẽ mang lại cho bạn rất nhiều phản hồi tiêu cực. Hy vọng bạn mặc bộ đồ hazmat của bạn. Dù sao, con đường ít kháng cự nhất là ; chỉ cần sử dụng tập lệnh init của bạn.
Michael Hampton

6
Một ngày nào đó, chắc chắn, tôi sẽ làm điều đúng đắn. Nhưng chúng ta sống trong một thế giới của nguồn lực hạn chế. Tôi đã thêm chi tiết về những gì không hoạt động, vì rõ ràng điều này được cho là đã hoạt động.
mlissner

Bạn đang cố gắng làm điều này trên Ubuntu? Chúa giúp bạn, tại sao?
Michael Hampton

1
Tôi là. Điều đó có tệ hơn bất cứ nơi nào khác không?
mlissner

1
Trong số tất cả các thất bại khác của Ubuntu, điều liên quan ở đây là Upstart là một cơn ác mộng đáng sợ. Nó tốt mà họ đang cuối cùng nhận được thoát khỏi nó, nhưng init script của bạn như là không thực sự tương thích với nó. Cách thức hoạt động trước đây rất có thể thông qua khả năng tương thích SysV (cổ đại) và trong khi systemd có thể xử lý việc này, Ubuntu rõ ràng đã làm một cái gì đó để phá vỡ nó. Tôi sẽ không khuyên bạn nên cố gắng để làm cho công việc này, đặc biệt là vì nó sẽ khiến bạn mất ít thời gian hơn để viết tệp đơn vị systemd so với bạn đã dành cho việc này.
Michael Hampton

Câu trả lời:


34

Nghiêm túc mà nói, một tệp đơn vị systemd là tầm thường để viết cho một dịch vụ như thế này ... hoặc cho hầu hết các dịch vụ.

Điều này phải giúp bạn có được khoảng 95%. Đặt cái này vào, ví dụ,/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

Lưu ý những thứ không có ở đây, như tệp nhật ký, v.v. systemd sẽ tự động nắm bắt và ghi nhật ký đầu ra dịch vụ dưới tên của dịch vụ.


5
Chà, điều này khiến tôi mất ít nhiều thời gian để chỉnh sửa và cấu hình và mọi thứ. systemdcó một số điểm kỳ lạ, như kịch bản này sẽ không có nhật ký liên tục trừ khi bạn bật nó lên. Cuối cùng, nó vẫn hoạt động và sự thúc đẩy của bạn là điều tôi cần, cảm ơn.
mlissner

15

Đối với tôi dễ dàng hơn khi chỉ cần thêm khối thông tin init trong tiêu đề như được đề xuất ở đây :

#!/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

Sau đó, thực hiện sudo systemctl enable solr.


1
Bạn có một lỗi đánh máy trong mã của bạn giống như tôi đã mắc phải và đang ngăn tập lệnh của tôi hoạt động (do đó gặp phải "contains no runlevels, aborting"lỗi khét tiếng ) cho đến khi tôi nhận ra nó: một số thứ ba bị thiếu trong dòng thứ hai của bạn (nó phải như vậy ### BEGIN INIT INFO). Tôi cá rằng điều đó cũng sẽ giải thích tại sao bạn cũng có rất ít phiếu bầu.
Pere

1
Rất tiếc, bạn đã đúng, có lẽ nó đã bị xóa trong quá trình sao chép-dán! (đã sửa ngay)
eadmaster

7

Một giải pháp khác để sử dụng tập lệnh init kế thừa solr với systemd:

systemctl daemon-reload  
systemctl enable solr  
systemctl start solr  

1
Anh ấy đã thử nó và nó không hoạt động, vì Ubuntu là lỗi.
Michael Hampton

4

Sẽ thuận tiện hơn khi chạy Solr bằng cách sử dụng tập lệnh bắt đầu được cung cấp .

Tệp đơn vị systemd trông như thế này:

[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

Lưu ý rằng bạn cũng có thể sử dụng các biến môi trường của mình bằng cách thêm EnvironmentFilevào [Service]phần. Kịch bản bin/solrtôn trọng các biến môi trường, chỉ cần xem trong đó.


Hôm nay tốt Tại thời điểm câu hỏi ban đầu được viết, không có đơn vị systemd nào được cung cấp cho Solr.
Michael Hampton

1

Đã thử nghiệm trên Debian: Thêm '_SYIUSCTL_SKIP_REDIRECT = OHYES' khi bắt đầu tập lệnh.

Các fanboy của Systemd có thể không thích nó, nhưng này, tôi không thích systemd, nên có :).


hoặc SYSTEMCTL_SKIP_REDIRECT=truetrong redhat
Otheus

không làm việc cho tôi :(
eadmaster 18/03/2017

Hãy chắc chắn rằng bạn thêm _(gạch dưới) trước SYSTEMCTL, như thế này : _SYSTEMCTL_SKIP_REDIRECT=1. Nếu bạn thử điều đó từ dòng lệnh, bạn cũng cần xuất var đó.
timurb

1

Tôi đã gặp lỗi tương tự trong khi thử sử dụng tập lệnh init LSB trên CentOS 7. Nguyên nhân gốc rễ hóa ra là tập lệnh là một liên kết tượng trưng. Sau khi được thay thế bằng một bản sao của bản gốc, mọi thứ đều hoạt động tốt.


Đó có thể là trường hợp cho kịch bản của tôi là tốt.
mlissner
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.