我一直在尝试通过停止和禁用 20 个左右的默认服务来强化我的 Debian 系统。其中之一称为“minissdpd”。显然,这为即插即用设备提供了“发现”服务,无论这意味着什么。对我来说似乎有点疯狂,一些旨在帮助本地外围设备的东西需要听取世界另一端的中国黑客的意见。发现服务甚至意味着什么?
我查看了一些漏洞数据库,果然 minissdpd 列出了一大堆漏洞。他们如何在默认发行版中启用此功能?说真的,就像安装 Debian 一样,被黑了。
无论如何,我的主要问题是:既然我已经禁用了这项服务,会不会发生一些不好的事情(比如插入一些东西,但它不起作用)?
我刚刚开始深入了解 Linux 的内部结构,我想知道 udev 和 hal 守护进程之间有什么区别。据我所知,两者似乎都负责管理热插拔设备...... udev 停止使用它们来监听,还是它们是两个独立的东西?
我正在帮助一位遇到后台进程间歇性死亡问题的同事。
我发现他们通过登录服务器并执行以下操作来启动后台进程:
su - <user> -c '<command>' &
Run Code Online (Sandbox Code Playgroud)
“啊哈”,我惊呼。“如果你用“&”开始一个命令,它会在你退出控制终端时挂断。你需要使用类似 nohup 的东西来实现这一点。真的这个进程需要支持作为守护进程运行,啧啧。”
我们测试了上面的命令来证明我的观点......它似乎有效:当我们退出运行上述命令的终端时,由命令启动的进程没有退出。
command是一个自定义 Python 脚本,其输出到一个文件。据我所知,脚本中没有像“守护进程”这样的智能功能。它不执行维基百科中列出的作为守护进程运行所需的任何事情:守护进程(计算):创建页面。
像这样运行命令会按预期运行:
<command> &
exit
Run Code Online (Sandbox Code Playgroud)
在上述情况下,当我们退出终端时,由命令启动的后台进程就退出了。
我的问题是这样的:
当我们添加“su - -c &”以防止进程在终端退出时退出时会发生什么。我想详细了解控制终端,标准输入和输出等。
这是实现将此命令作为后台进程运行的目标的合理方法吗?如果不是为什么,不是?
我想在我的公司内传播最佳实践,但我需要能够展示和支持我提出的任何建议。
我也想了解到底发生了什么。
来自 Mauerer 的 Linux 内核架构,
内核线程是由内核本身直接启动的进程。它们将内核函数委托给一个单独的进程,并在那里与系统中的其他进程“并行”执行(实际上,与内核本身的执行并行)。内核线程通常被称为(内核)守护进程。例如,它们用于执行以下任务:
- 定期将修改的内存页面与页面来源的块设备同步(例如,使用 mmap 映射的文件)。
- 将很少使用的内存页写入交换区。
- 管理延迟的操作。
- 为文件系统实现事务日志。
基本上,有两种类型的内核线程:
- 类型 1 — 线程启动并等待,直到内核请求执行特定操作。
- 类型 2 — 一旦启动,线程就会定期运行,检查特定资源的利用率,并在利用率超过或低于设定的限制值时采取行动。内核使用这种类型的线程进行持续监控任务。
由于 Mauerer 的书说内核线程是进程,我认为它们必须在用户模式下运行,而不是在内核模式下运行。(或者我错了?进程可以在不同时间以用户模式或内核模式运行,还是仅在一种模式下运行?)
但是 Bovet 的《Understanding Linux Kernel》说内核线程只在内核模式下运行(见下面的引述)。两本书中“内核线程”的概念是同一个概念吗?
传统的 Unix 系统将一些关键任务委托给间歇运行的进程,包括刷新磁盘缓存、换出未使用的页面、服务网络连接等。事实上,以严格的线性方式执行这些任务是没有效率的。如果在后台调度它们的功能和最终用户进程,它们都会得到更好的响应。因为一些系统进程只在内核模式下运行,现代操作系统将它们的功能委托给内核线程,内核线程不会受到不必要的用户模式上下文的影响。在 Linux 中,内核线程在以下方面与常规进程不同:
- 内核线程仅在内核模式下运行,而常规进程在内核模式和用户模式下交替运行。
- 因为内核线程只在内核模式下运行,所以它们只使用大于 PAGE_OFFSET 的线性地址。另一方面,常规进程在用户模式或内核模式下使用所有 4 GB 的线性地址。
Mauerer 的书说内核线程是由内核直接启动的,而且似乎还说守护进程是内核线程的同义词。所以我认为守护进程必须由内核直接启动。
但是https://unix.stackexchange.com/a/193918/674说那个screen守护进程是由screen用户界面启动的(见下面的引用)。我认为screen用户界面是一个进程,而不是内核。是的概念daemon在Mauerer的书,并在链接的答复同一个概念?
当您第一次启动时
screen,您实际上是在启动一个用户界面 (ui),它默认会创建一个守护进程(会话管理器)。
总的来说,您如何理解“内核线程”、“进程”和“守护进程”的概念,它们的关系和区别?
我将这个定义用于systemd工作:
[Unit]
Description=Some job
[Service]
ExecStart=/usr/local/sbin/somejob
User=dlt
Type=forking
[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)
脚本调用如下(调用一个简单的例程,侦听 tcpip 套接字并将输入附加到文件):
#!/bin/sh
cd /home/user/tmp/testout
nohup java -jar /home/user/programming/tests/java/core/SocketTest/SocketTest.jar </dev/null >/dev/null &
Run Code Online (Sandbox Code Playgroud)
之后systemctl start somejob的过程显示为下运行,同时init作为其父:
user@CANTANDO ~$ ps -u dlt eo pid,ppid,command
PID PPID COMMAND
8718 1 java -jar /home/user/programming/tests/java/core/SocketTest/SocketTest.jar
Run Code Online (Sandbox Code Playgroud)
执行systemctl stop somejob该过程后不再显示(并且端口已关闭)。
所以一切看起来都很好
我的问题是:这是运行 java 守护进程的可接受的解决方案systemd,还是有警告,以及其他更稳定或安全的方法来实现这一目标?
命令是什么或者如何将进程变成 Linux 中的服务?服务本质上不就是一个守护进程吗?
只要我使用某个用户登录,我就需要运行一些后台进程。
是否存在类似于每用户守护进程的东西?我只知道从计算机启动到关机(或手动启动/终止)的全局守护进程。
现在我制作了一个脚本来检查进程是否已经存在,如果不存在则创建进程。然后使用nohupmy 中的命令运行此脚本.profile。这样,流程在启动时启动,并且只启动一次(即使有多个rxvt术语来来去去)。然而,在我登录后它永远不会被杀死(这不是一场灾难,但终止进程会更干净)。
http://linuxg.net/how-to-transform-a-process-into-a-daemon-in-linux-unix/给出了一个在 bash 中守护进程的例子:
$ nohup firefox& &> /dev/null
Run Code Online (Sandbox Code Playgroud)
如果我是对的,该命令与“nohup 和后台进程”相同。但是守护进程不只是一个 nohupped 和后台进程吗?
这里缺少哪些步骤来守护进程?
例如,在守护进程时是否不需要更改父进程?如果是,你如何在 bash 中做到这一点?我仍在尝试了解相关回复https://unix.stackexchange.com/a/177361/674。
还有哪些步骤和条件?
看我的相关问题/sf/ask/2499381601/
我知道必须向守护进程发送 HUP 才能使配置更改生效。但我想知道为什么会这样,以及是否可以创建一个响应此类更改的守护程序。
我正在尝试按照本指南以非 root 用户身份安装 Docker 守护进程: https: //docs.docker.com/engine/security/rootless/
首先,我删除了现有的 rootful docker 守护进程。
然后我创建了一个名为的用户docker-user并使其成为docker组的成员
然后我切换到该 docker 用户的 shell,如下所示:
sudo -iu docker-user
Run Code Online (Sandbox Code Playgroud)
并运行上面链接中给出的无根docker安装脚本。
脚本输出:
docker-user@ubuntu:~$ curl -fsSL https://get.docker.com/rootless | sh
# Installing stable version 19.03.8
# Existing rootless Docker detected at /home/docker-user/bin/dockerd
# systemd not detected, dockerd daemon needs to be started manually
/home/docker-user/bin/dockerd-rootless.sh --experimental --storage-driver vfs
# Docker binaries are installed in /home/docker-user/bin
# Make sure the following environment variables are set (or add them to ~/.bashrc):
export …Run Code Online (Sandbox Code Playgroud)