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

mli*_*ner 62 init.d systemd

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

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

目前的情况是:

systemctl start solr
Failed to start solr.service: Unit solr.service failed to load: No such file or directory.
Run Code Online (Sandbox Code Playgroud)

和:

sudo service solr start
Failed to start solr.service: Unit solr.service failed to load: No such file or directory.
Run Code Online (Sandbox Code Playgroud)

现在,我只想回去工作。让它再次工作的阻力最小的路径是什么?

更新

我不想弄清楚这一切——我真的不想——但我必须这样做,而且我已经发现了我的第一个线索:

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.
Run Code Online (Sandbox Code Playgroud)

systemd不兼容性页面说:

LSB 头依赖信息很重要。许多发行版上的 SysV 实现没有使用 LSB init 脚本头中编码的依赖信息,或者仅以非常有限的方式使用它们。因此,它们通常不正确或不完整。然而,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
Run Code Online (Sandbox Code Playgroud)

Mic*_*ton 34

说真的,为这样的服务或大多数服务编写 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
Run Code Online (Sandbox Code Playgroud)

注意不在这里的东西,比如日志文件等;systemd 将自动捕获并记录服务名称下的服务输出。

  • 好吧,这或多或少花了我一整天的时间来调整和配置以及一切。`systemd` 有一些奇怪的地方,比如这个脚本不会有持久日志,除非你打开它。最后,它仍然有效,您的推动正是我所需要的,谢谢。 (7认同)

ead*_*ter 26

对我来说,按照此处的建议标题中添加 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
Run Code Online (Sandbox Code Playgroud)

然后,执行sudo systemctl enable solr.

  • 您的代码中有一个拼写错误,恰好与我相同,并且阻止了我的脚本工作(因此得到了臭名昭著的“不包含运行级别,正在中止”的错误),直到我意识到这一点:**缺少第三个#你的第二行**(它应该是`### BEGIN INIT INFO`)。我敢打赌,这也可以解释为什么您的选票如此之少。 (4认同)
  • 哎呀,你是对的,可能它在复制粘贴过程中被删除了!(现已修复) (2认同)
  • 我发现如果 /etc/init.d 中的文件是一个符号链接,那么扫描遗留 init.d 脚本的 systemd 生成器“systemd-sysv-generator”将跳过它。我在 init.d 中的 gerrit 文件是 /home/gerrit2/gerrit/bin/gerrit.sh 的符号链接,我使用以下命令修复它: cd /etc/init.d; sudo unlink gerrit; 须藤cp /home/gerrit2/gerrit/bin/gerrit.sh gerrit (2认同)
  • 我将为后代添加一些内容:如果您的 init.d 脚本碰巧不可执行,systemd 将忽略它但不会告诉您。它会表现得好像它不存在一样。也许它在某处记录了错误,但我还没有找到它。确保安装的init脚本权限为755。 (2认同)

小智 12

在 systemd 中使用 solr legacy init 脚本的另一种解决方案:

systemctl daemon-reload  
systemctl enable solr  
systemctl start solr  
Run Code Online (Sandbox Code Playgroud)

  • 他_已经_尝试过,但没有成功,因为 Ubuntu 有问题。 (2认同)

Jiř*_*ský 6

使用提供的启动脚本运行 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
Run Code Online (Sandbox Code Playgroud)

请注意,您还可以通过添加EnvironmentFile到该[Service]部分来使用您的环境变量。该脚本bin/solr尊重环境变量,只需查看它。

  • 请注意,我并不是建议使用提供的“systemd 单元”(我只是没有找到任何),而是建议使用“solr”可执行文件,该可执行文件在自定义“systemd 单元”定义中处理“启动/停止”参数。 (2认同)