AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 690155
Accepted
mlissner
mlissner
Asked: 2015-05-07 14:57:35 +0800 CST2015-05-07 14:57:35 +0800 CST 2015-05-07 14:57:35 +0800 CST

让我的旧初始化脚本在 systemd 中工作的最简单方法是什么?

  • 772

我不想通过创建新的 systemd 脚本来做正确的事情,我只想让旧的 init 脚本再次工作,因为我已经将系统升级到使用 systemd 的操作系统。

我已经简要研究了如何转换 init 脚本以及如何编写 systemd 脚本,但我确信正确地学习它并正确地完成它需要几个小时。

目前的情况是:

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
systemd init.d
  • 7 7 个回答
  • 125400 Views

7 个回答

  • Voted
  1. Best Answer
    Michael Hampton
    2015-05-07T17:42:55+08:002015-05-07T17:42:55+08:00

    说真的,为这样的服务编写一个 systemd 单元文件是微不足道的……或者对于大多数服务。

    这应该能让你到达那里的大约 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 将自动捕获并记录服务名称下的服务输出。

    • 35
  2. eadmaster
    2017-03-18T22:57:08+08:002017-03-18T22:57:08+08:00

    对我来说,按照这里的建议在标题中添加初始化信息块更容易:

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

    • 28
  3. grégory eve
    2015-08-14T00:56:50+08:002015-08-14T00:56:50+08:00

    将 solr legacy init 脚本与 systemd 一起使用的另一种解决方案:

    systemctl daemon-reload  
    systemctl enable solr  
    systemctl start solr  
    
    • 12
  4. Jiří Kozlovský
    2017-09-01T23:41:43+08:002017-09-01T23:41:43+08:00

    使用提供的启动脚本运行 Solr 更方便。

    systemd 单元文件如下所示:

    [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尊重环境变量,只需看看它。

    • 8
  5. Guy Egozy
    2016-09-16T02:37:44+08:002016-09-16T02:37:44+08:00

    在 Debian 上测试:在脚本开头添加“_SYSTEMCTL_SKIP_REDIRECT=OHYES”。

    Systemd 的粉丝可能不喜欢它,但是嘿,我不喜欢 systemd,所以 :)。

    • 1
  6. gatopeich
    2016-11-15T23:52:49+08:002016-11-15T23:52:49+08:00

    我在 CentOS 7 上尝试使用 LSB 初始化脚本时遇到了同样的错误。根本原因是该脚本是一个符号链接。一旦用原件的副本替换,一切正常。

    • 1
  7. Oly Dungey
    2021-05-11T08:20:36+08:002021-05-11T08:20:36+08:00

    OP问题的最简单答案是:

    chkconfig {{service-name}} on- 这将启用现有的 SysV 服务,而无需做任何其他事情。我想这不完全是最初的问题,它是在一种遗留模式下运行,但它允许我在版本 7 上运行旧的 CentOS 6 服务而无需额外工作。

    运行此命令后,您可以通过标准systemctl命令控制服务,因为它会创建单元包装器-thingmyjigwhatsit。

    • 1

相关问题

  • 在 CentOS 7 上为 systemd 启动的进程增加 nproc

  • 如何在systemd服务中设置环境变量?

  • 将 shell 脚本置于 systemd 控制之下

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve