问题标签 [sysv]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - 使用 fork() 接收 SysV 消息
我试图在一系列 fork() 中接收我用 msgsnd 发送的一系列消息。我可以说发送的消息正常,但接收它们一直是个问题。这是代码的问题部分,以三个消息为例:
如果我在没有 fork() 的情况下编写类似的代码,它工作正常,所以我知道 fork() 以我不理解的方式弄乱了我的消息队列。有人可以告诉我为什么这在 fork() 中不起作用,以及我如何以这样的方式编写代码以使我的 fork() 能够正确接收消息?
编辑:我得到的是:第一个 fork 处理运行良好,第二个很少,第三个总是失败。errno 设置为 22,即 Invalid Argument。
更新(使用的声明):
linux - SysV 消息队列数量增加
我有一个场景:
1:有reader进程和writer进程,这些进程通过SysV消息队列进行通信。
2:Writer进程比Reader进程快,即Writer进程在队列中写入消息比Reader进程读取消息并清空队列快,例如如果我在队列中有8条消息(单个消息队列)和Reader进程当时尚未读取一条消息,写入程序进程试图写入(msgsnd)队列中的第 9 条消息。
3:我的任何消息都会被覆盖会怎样?
4:或者我在队列中的最后一条或第一条消息会被覆盖?
5:还是整个队列都会被覆盖?
6:否则第 9 条消息会丢失?
7:我怎样才能确保这些情况都不会发生,我不会丢失任何新的传入消息并且不会覆盖现有的消息?
8:我该如何处理这种情况?
问候
init.d - 基于 Spring Boot (Tomcat) 的应用程序作为守护进程 - 如何停止?
我编写了一个使用嵌入式 tomcat作为容器的Spring Boot Web 服务。
如果系统重新启动,我想将一些信息备份到 mysql 数据库。
在我的网络服务中,我使用@Scheduled()
并@PreDestroy
运行备份。
当我用 ^C 停止服务器时,一切顺利。
但是,当我使用sysV skript ( /etc/init.d
) 和 kill 命令终止进程时 - 即使守护进程依赖于 mysql,mysql 服务器也会在备份完成之前关闭(导致我的日志中出现 SQL 异常)。
这样做的原因当然是 kill 只发送一个信号来停止进程。
我如何(从我的 sysv 脚本)同步停止正在运行的 spring boot tomcat 服务器?
systemd - 如何在 ExecStart 命令行中使用参数?
我尝试将 Debian(以及 LinuxMint 和 Ubuntu & Co. 等衍生发行版)上使用的 SysVintit 脚本转换为在 Fedora 或 ArchLinux(以及 Bridge 或 Manjaro 等衍生发行版)上使用的 systemd 服务,但即使 systemd启动系统比以前的系统性能更高,用途更广泛,我不明白如何制作简单的东西,例如在命令行上使用“可选”参数,如 ExecStart= 或 ExecRestart= !
这是我对 SysVinit 所做的事情:
因此,上面的脚本允许使用不同的参数,包括一个空参数,当使用以下命令行时将显示消息“Usage: ...”:
现在,使用 systemd,脚本应该如下所示:
这里开始我的问题(以及我缺乏系统知识):
显然,systemd 没有提供诸如 ExecCustom01=、ExecCustom02 等命令,这些命令允许我为“version”和“try”(以及其他如果需要)创建命令。
因此,如果我可以使用参数来启动“版本”或“尝试”命令,我可以以不同的方式使用 ExecRestart(据说“真正的”重新启动可以通过连续启动停止和启动命令来完成)。
这些“定制”的 ExecRestart= 命令可能如下所示:
和
systemd 脚本可能如下所示:
但我不知道这是否可能,如果可以,使用的语法是什么!
任何帮助都将不胜感激,因为即使在多个 systemd 手册页中花费了几个小时后,我也找不到任何关于如何做到这一点的明确示例。
TIA 为您提供时间和建议。
php - 使用信号量在共享内存同步中嵌套锁定/释放调用
[编辑] 完全重写并添加背景(下面的原始问题)
在 PHP 中运行的应用程序中,出于性能原因(数据库开销太大且文件太慢),我使用共享内存临时存储值。
我构建了一个非常简单的共享内存类,它允许脚本访问存储在共享内存中的变量,并且能够使用信号量同步调用。代码在这里(目前还没有错误处理):
我现在有另一个使用这个共享内存类的类,需要对一个变量执行“获取、修改和写入”操作。基本上,这是:
现在的方式,这将锁定信号量,释放它,再次锁定它,然后释放它。我很想一直用信号量锁执行代码。
以前,我的代码由一sem_acquire
对包围sem_release
。不幸的是(感谢@Ben),System V 二进制信号量阻塞lock
了同一进程的其他调用。
PHP 中也没有监视器(实际上可以解决它),而且我不太热衷于使用一些共享内存变量(我想我也可以这样做......)加上传统的信号量来自己实现它们. 我需要独占访问,所以非二进制信号量也不是一个选项。
在不违反 DRY 原则的情况下,对如何执行此操作有任何建议吗?
原始问题
只是一个关于 System V 信号量如何工作以及 PHP 如何使用它们的快速问题:
sem_acquire
如果我在一个进程中多次锁定( )一个信号量,信号量值实际上是否随着每次调用而增加(所以我需要sem_release
像锁定它一样频繁地释放()它),或者做额外的调用sem_acquire
只是继续而不计数如果进程已经拥有信号量(所以第一个free
总是解锁信号量)?
如有疑问,提示如何合理测试就足够了^^
例子:
在上面的代码中,如果我调用doSomething1
,sem_release
内部是否doSomething2
已经为其他进程释放信号量,或者信号量计数器实际上是否设置为“2”(即使它只有一个容量,因为在 中没有指定其他内容sem_get
)和信号量保持锁定直到第二次释放?
显然,我需要它保持锁定状态doSOmething1
,直到完成工作。当然,我可以直接复制 的内容doSomething2
,但这违反了 DRY 原则,我想避免它。当然,我也可以将工作打包doSOmething2
在一个私有函数中,并从其他两个函数中调用该函数,但这也是额外的,可能是不必要的开销 - 所以我在做之前先问一下。而且,当然³,真正的事情并不是那么简单。
我确实知道信号量一般是如何工作的,但是由于有多种实现策略,我想确保 System V 信号量按照我期望的方式工作(也就是说,增加计数器并要求尽可能多的free
调用接lock
电话)。
c - 弄清楚 startpar.c (sysvinit) 在做什么
好的,这是一个长的,振作起来!:)
最近我尝试在启动期间启动一个用 bash 编写的看门狗脚本。因此,我在rc.local中添加了一行,其中包含以下内容:
watchdog.sh 看起来像这样:
一切都很好,一切都很好,脚本开始了。然而,一个新的进程出现在进程列表中,并永远留在那里:
现在,我的脚本 (watchdog.sh) 启动并成功分离,因为它的 PPID 也是 1。然后我的任务是找出该进程是什么。Startpar 是sysvinit引导系统 ( http://savannah.nongnu.org/projects/sysvinit ) 的一部分。我目前正在使用该系统的 Debian Wheezy 7.4.0。现在man startpar
说:
通过反复试验的方法,我基本上弄清楚了如何在启动期间正确启动我的脚本,而不是让startpar挂起。进程的所有文件描述符都需要重定向到文件或/dev/null或一起关闭。当您考虑时,这是一件理性的事情。我终于这样做了:
这解决了这个问题。但仍然让我想知道为什么会这样。为什么startpar 的行为如此。它是一个错误还是一个功能。
所以我深入研究了代码(http://svn.savannah.nongnu.org/viewvc/startpar/trunk/startpar.c?root=sysvinit&view=markup)并从头到尾开始:
首先,我找到了startpar -f -- rc.local调用的位置:
第 741 行:
好的,这实际上将启动一个新的startpar进程,它将替换当前正在运行的实例。它基本上是对自身的递归调用。让我们看看-f参数的作用:
第 866 行:
好的,让我们看看将forw变量设置为1的作用......
第 900 行:
最后让我们看看这个函数是怎么回事:
第 615 行:
据我了解。这会将来自文件描述符 0 的所有内容重定向到文件描述符 1。现在让我们看看真正链接到这些文件描述符的内容:
嗯很有趣......所以 ptmx 是根据人的:
和控制台:
那时我来这里是为了stackoverflow。现在,有人能告诉我这里发生了什么吗?我做对了吗,那个 startpar 处于不断将ptmx的任何内容重定向到控制台的阶段?为什么这样做?为什么是 ptmx?这是一个错误吗?
linux-kernel - 无法更改 gpio 值
目前我正在尝试在 2.6.39 linux 内核上使用 systemd 检查 Tixi 板的启动时间。为此,我创建了一个服务文件,该文件调用一个设置和使用 gpio 的 bash 脚本。问题是我的系统不允许我更改 gpio 的值。我可以成功地导出它,改变它的方向,但不能改变它的值。我已连接示波器以检查硬件中的值是否已更改,但未按照某些论坛的建议在文件中更新,但它是相同的:值只是没有改变!我还应该指出,如果我使用系统 V,相同的脚本正在工作,内核、busybox 和文件系统的配置完全相同。
这很讽刺,因为我已经是系统的根,但是即使更改文件的权限,也不允许我更改其值。内核也没有反馈说该操作是不可能的,而是看起来好像是可能的,但是当我检查值时,它和以前一样。
我还尝试使用 3.12(我将其更改为 systemd)在 Raspbian 中运行它,实际上它是可以做到的,只是从用户空间以正常方式。
如果您有任何想法,我将不胜感激,因为我已经没有想法了,可能是什么问题。
谢谢
PS:这是应该在 bash 行上工作的代码:
尽管如此,如果我使用 systemV,同一块板上的相同代码行可以工作,但如果我使用 systemd,则不能
linux - insserv:缺少`Required-Stop:'条目:即使为空也请添加
在 /etc/init.d/myservice 脚本中,我有以下几行
尽管如此,在执行命令 **/sbin/chkconfig --add myserviced 时省略了以下错误消息
我读过帖子不完整的 LSB 评论。insserv:缺少“提供:”的有效名称,请添加。但没有任何帮助。
此错误发生在 SUSE 11 而不是 Rehat-6
linux - update-rc.d 默认设置运行级别?
阅读 update-rc.d 手册页:
update-rc.d 要求在所有 init.d 脚本的 init.d 脚本 LSB 注释标头中提供依赖项和运行级别信息。
我是否正确解释以下命令如下:
我理解以上将导致:
1) /etc/rcrunlevel.d/99name 链接已创建
2) 指向 /etc/init.d/foo
我不确定 10 的用途,它真的代表运行级别吗?在这种情况下,是否意味着 foo 可以运行管理任务(单用户模式)并可以关闭系统(停止)
*NN - 是 LSB 注释标头中的依赖项,即序列号 (1-99)
ubuntu - 用 SaltStack 解决:initctl: `Unable to connect to Upstart: Failed to connect to socket /com/ubuntu/upstart: Connection refused`
当我尝试使用 virtualbox 在标准 ubuntu/vivid64 上“vagrant up”时出现以下错误:initctl: Unable to connect to Upstart: Failed to connect to socket /com/ubuntu/upstart: Connection refused
完整的错误流在这里:https ://pastee.org/hnh8x
一定要和我们的老朋友打个招呼stdin: is not a tty
。
请在Vagrantfile
此处找到相关内容:https ://pastee.org/sfyb7 ,创建于vagrant init --force ubuntu/vivid64 https://cloud-images.ubuntu.com/vagrant/vivid/current/vivid-server-cloudimg-amd64-vagrant-disk1.box
.
我可以通过 Saltstack 配置修复此错误吗?如果是这样,怎么做?
我发现与 Upstart 相关的最接近的 Saltstack 文档如下:http ://docs.saltstack.com/en/latest/ref/modules/all/salt.modules.upstart.html
有关该主题的 Ubuntu 文档(此处为https://wiki.ubuntu.com/SystemdForUpstartUsers)建议安装该upstart-sysv
软件包。这就是使用 Saltstack 更改回来所需的全部内容吗?
以下似乎无法解决启动问题:
我可以添加什么来帮助解决问题吗?