gpt4 book ai didi

c++ - 程序 (nload) 在 shell 中执行时作为守护进程运行,但不在启动/自动化脚本中执行

转载 作者:太空狗 更新时间:2023-10-29 12:43:20 26 4
gpt4 key购买 nike

我想在启动时将 nload(网络吞吐量监视器)作为守护进程运行(或者只是一般地自动运行)。我可以通过键入以下命令从命令行成功地将它作为守护进程运行:

nload eth0 >& /dev/null &

只是一些背景:我稍微修改了 nload 源代码(用 C++ 编写),除了输出到屏幕之外还写入文件。我想从 nload 写入的文件中读取吞吐量值。我输出到/dev/null 的原因是我不需要担心 stdout 输出。

奇怪的是,当我手动运行它时,它作为守护进程运行得很好,而且我能够从文件中读取吞吐量值。但是每一次自动化尝试都失败了。我试过 init.d、rc.local、cron 但没有成功。我编写的用于自动化运行的脚本是:

#!/bin/bash
echo "starting nload"
/usr/bin/nload eth0 >& /dev/null &
if [ $? -eq 0 ]; then
echo started nload
else
echo failed to start nload
fi

我可以确认在自动化时,脚本会运行,因为我尝试记录输出。它甚至记录“启动 nload”,但当我查看运行 nload 的进程列表时,它不是其中之一。我还可以确认,当从 shell 手动运行脚本时,nload 可以作为守护进程正常启动。

有谁知道在通过自动脚本运行时可能会阻止此程序运行的原因是什么?

最佳答案

如果 nload 不是从终端运行,它看起来会崩溃。

viroos@null-linux:~$ cat /etc/rc.local
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.

strace -o /tmp/nload.trace /usr/bin/nload

exit 0

看起来缺少 HOME 环境变量:

viroos@null-linux:~$ cat /tmp/nload.trace
brk(0x1f83000) = 0x1f83000
write(2, "Could not retrieve home director"..., 34) = 34
write(2, "\n", 1) = 1
exit_group(1) = ?
+++ exited with 1 +++

让我们解决这个问题:

#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.

export HOME=/tmp
strace -o /tmp/nload.trace /usr/bin/nload

exit 0

我们还有一个问题:

viroos@null-linux:~$ cat /tmp/nload.trace
read(3, "\32\1\36\0\7\0\1\0\202\0\10\0unknown|unknown term"..., 4096) = 320
read(3, "", 4096) = 0
close(3) = 0
munmap(0x7f23e62c9000, 4096) = 0
ioctl(2, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, 0x7ffedd149010) = -1 ENOTTY (Inappropriate ioctl for device)
ioctl(2, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, 0x7ffedd148fb0) = -1 ENOTTY (Inappropriate ioctl for device)
write(2, "Error opening terminal: unknown."..., 33) = 33
exit_group(1) = ?
+++ exited with 1 +++

我看到你提到你修改了 nload 代码,但我猜你还没有删除处理丢失的终端。您可以尝试进一步编辑 nload 代码或在分离模式下使用屏幕:

viroos@null-linux:~$ cat /etc/rc.local
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.

export HOME=/tmp
screen -S nload -dm /usr/bin/nload


exit 0

关于c++ - 程序 (nload) 在 shell 中执行时作为守护进程运行,但不在启动/自动化脚本中执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34550561/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com