start-stop-daemon:Debian 中未找到命令错误

start-stop-daemon:Debian 中未找到命令错误

我是一名 Linux 新手,正在 Debian 上迈出第一步。我试图将一个简单的 Python 脚本作为服务执行,并且我尝试执行此代码(从网上复制)来执行此操作。

DIR=/usr/local/bin/myservice
DAEMON=$DIR/myservice.py
DAEMON_NAME=myservice

# Add any command line options for your daemon here
DAEMON_OPTS=""

# This next line determines what user the script runs as.
# Root generally not recommended but necessary if you are using the Raspberry Pi GPIO from Python.
DAEMON_USER=root

# The process ID of the script when it runs is stored here:
PIDFILE=/var/run/$DAEMON_NAME.pid

. /lib/lsb/init-functions

do_start () {
    log_daemon_msg "Starting system $DAEMON_NAME daemon"
    start-stop-daemon --start --background --pidfile $PIDFILE --make-pidfile --user $DAEMON_USER --chuid $DAEMON_USER --startas $DAEMON -- $DAEMON_OPTS
    log_end_msg $?
}
do_stop () {
    log_daemon_msg "Stopping system $DAEMON_NAME daemon"
    start-stop-daemon --stop --pidfile $PIDFILE --retry 10
    log_end_msg $?
}

case "$1" in

    start|stop)
        do_${1}
        ;;

    restart|reload|force-reload)
        do_stop
        do_start
        ;;

    status)
        status_of_proc "$DAEMON_NAME" "$DAEMON" && exit 0 || exit $?
        ;;

    *)
        echo "Usage: /etc/init.d/$DAEMON_NAME {start|stop|restart|status}"
        exit 1
        ;;

esac
exit 0

无论如何,当我尝试启动初始化脚本时,他说:

bash: start-stop-daemon: command not found

所以我尝试使用 which 命令来定位它,但没有结果。而且它也不在 /usr/bin 中。我遗漏了什么?我正在使用 Debian 10(在 virtualbox 上全新安装)

答案1

我在使用构建 Ubuntu 实时映像时遇到了这个问题live-build

就我而言start-stop-daemon以某种方式被删除或损坏,这意味着和apt都不apt-get可用。

事实证明,dpkg当类似功能缺失时,它也无法很好地发挥作用。

该程序来自软件包,软件包是用于安装文件dpkg的底层工具。因此,我在archive.ubuntu.com上浏览了Ubuntu Focal,找到了与已安装的dpkg版本完全相同的版本,因此我可以安装它而不会出现任何库冲突。apt.deb

Dpkg 的软件包文件存储在官方 Ubuntu 仓库中:http://archive.ubuntu.com/ubuntu/pool/main/d/dpkg/

使用以下命令检查您现有的 dpkg 版本:

apt show dpkg

接下来,下载.debdpkg 的文件,确保获取相同的版本和架构(例如 1.9.7_amd64),如果没有,则获取非常接近的版本(例如 1.9.9)。

wget http://archive.ubuntu.com/ubuntu/pool/main/d/dpkg/dpkg_1.19.7ubuntu3_amd64.deb

由于dpkg依赖于 start-stop-daemon 来实际安装自身,我们需要制作一个不会发生冲突的虚拟二进制文件与新安装的版本相同。虚拟二进制文件将仅返回 0(成功),仅此而已。

将其放入/usr/bin//bin/- 但不要放入/sbin//usr/sbin/。真正的可执行文件将安装在/sbin/usr/sbin

# We use the very simple program /bin/true as the shebang, so that
# start-stop-daemon simply returns 0 (success) when ran.
echo '#!/bin/true' > /usr/bin/start-stop-daemon
# Make the file executable
chmod +x /usr/bin/start-stop-daemon

现在,我们应该能够重新dpkg安装start-stop-daemon

dpkg -i dpkg_1.19.7ubuntu3_amd64.deb

假设它安装成功,您现在需要删除虚拟可执行文件,以避免它优先于真正的可执行文件:

rm -f /usr/bin/start-stop-daemon

现在您就可以开始了 :)

笔记:如果您使用,zsh那么您应该确保rehash立即运行,以更新其二进制位置的缓存。

答案2

不过,您可能必须先设置 root 的 PATH。编辑/root/.bashrc(当然需要 root 权限),添加以下行并保存:

export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

然后在要执行的任何位置获取文件:# source /root/.bashrc

然后运行 ​​dpkg:# dpkg -i file.deb

相关内容