我是一名 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
接下来,下载.deb
dpkg 的文件,确保获取相同的版本和架构(例如 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