我如何在后台运行这个进程(v4l2rtspserver)?

我如何在后台运行这个进程(v4l2rtspserver)?

我正在尝试在 Debian 系统上运行(迪特皮树莓派):

v4l2rtspserver -H 1080 -W 1920 -F 30 -P 8555 /dev/video0

但尽管添加了,它仍在命令控制台中运行& 否认

我也尝试过& 工作但好像什么都没发生一样,它一直在命令控制台中运行,而不是在后台运行。

我注意到的是v4l2rtsp服务器运行多个进程,我想这可能是那里的问题。

   [1]+  Running                 v4l2rtspserver -H 1080 -W 1920 -F 30 -P 8555 /dev/video0 &
dietpi@DietPi:~$ log level:500

[NOTICE] /home/dietpi/v4l2rtspserver/main.cpp:297
        Version: 0.3.3-8-gb007df2 live555 version:2022.04.26
[NOTICE] /home/dietpi/v4l2rtspserver/src/V4l2RTSPServer.cpp:37
        Create V4L2 Source.../dev/video0
[NOTICE] /home/dietpi/v4l2rtspserver/v4l2wrapper/src/V4l2Device.cpp:133
        driver:bm2835 mmal capabilities:85200005 mandatory:4000001
[NOTICE] /home/dietpi/v4l2rtspserver/v4l2wrapper/src/V4l2Device.cpp:136
        /dev/video0 support capture
[NOTICE] /home/dietpi/v4l2rtspserver/v4l2wrapper/src/V4l2Device.cpp:138
        /dev/video0 support read/write
[NOTICE] /home/dietpi/v4l2rtspserver/v4l2wrapper/src/V4l2Device.cpp:139
        /dev/video0 support streaming
[NOTICE] /home/dietpi/v4l2rtspserver/v4l2wrapper/src/V4l2Device.cpp:225
        /dev/video0:H264 size:1920x1080 bufferSize:2088960
[NOTICE] /home/dietpi/v4l2rtspserver/v4l2wrapper/src/V4l2Device.cpp:246
        fps:1/30
[NOTICE] /home/dietpi/v4l2rtspserver/v4l2wrapper/src/V4l2Device.cpp:247
        nbBuffer:1
[NOTICE] /home/dietpi/v4l2rtspserver/v4l2wrapper/src/V4l2MmapDevice.cpp:49
        Device /dev/video0
[NOTICE] /home/dietpi/v4l2rtspserver/v4l2wrapper/src/V4l2MmapDevice.cpp:73
        Device /dev/video0 nb buffer:10
[NOTICE] /home/dietpi/v4l2rtspserver/src/V4l2RTSPServer.cpp:62
        Create Source .../dev/video0
[NOTICE] /home/dietpi/v4l2rtspserver/src/V4L2DeviceSource.cpp:96
        begin thread
[NOTICE] /home/dietpi/v4l2rtspserver/inc/BaseServerMediaSubsession.h:49
        format:video/H264
[NOTICE] /home/dietpi/v4l2rtspserver/inc/V4l2RTSPServer.h:80

我只用过Linux很短的一段时间,我没能找出问题所在。发生了什么事?谢谢。

编辑:

谢谢用户1686的解决方案现在它在后台运行没有问题,但我试图让它在系统启动时运行脚本,但我做不到。我已经添加了/etc/systemd/system/v4l2rtsp.service

[Unit]

Description=prueba

After=dev-video0.device

[Service]
Type=exec
User=dietpi
ExecStart=/home/dietpi/script_v4l2rtsp.sh

[Install]
WantedBy=multi-user.target

然后我保存了文件,并且输入了此命令,但是流没有启动:

sudo systemctl start v4l2rtsp

我也尝试过让它像这样在启动时运行,但是也没有结果:

sudo systemctl enable v4l2rtsp

尽管如果我独立运行该文件,它也能完美运行:

dietpi@DietPi:~$ sudo bash script_v4l2rtsp.sh
[1]+ Running v4l2rtspserver -H 1080 -W 1920 -F 30 -P 8555 /dev/video0 &> /dev/null &
dietpi@DietPi:~$

那可能发生吗?

答案1

在后台运行 – 您可以看到您立即返回到 shell 提示符 ( dietpi@DietPi:~$)。使用运算符时肯定会发生这种&情况,程序无法绕过这一点。

然而,&这只会让 shell 不再等待进程运行完毕,但实际上并没有分离程序的输出从它运行的终端。 (也没有disown,它只是告诉 shell 不要在注销时终止后台作业。)因此,您仍然可以与前台的 shell 进行交互,但是 shell 的输出与后台进程输出交错。

要丢弃输出,请使用以下命令重定向它>/dev/null 2>&1

$ v4l2rtspserver ..... >&/dev/null &
$ disown

但实际上你不应该首先做这些——你应该将 v4l2rtspserver 配置为服务。大多数 Linux 发行版都带有某种服务管理器(例如 systemd 或 Upstart),用于启动和管理后台任务,定义一个可以通过这种方式控制的新服务只需几行代码即可。

例如,Debian 使用 systemd,其中基本服务(/etc/systemd/system/v4l2rtsp.service)定义如下:

[Unit]
Description=Webcam RTSP server
After=dev-video0.device

[Service]
Type=exec
User=dietpi
ExecStart=v4l2rtspserver -H 1080 -W 1920 -F 30 -P 8555 /dev/video0

[Install]
WantedBy=multi-user.target

这将允许您使用 控制服务systemctl start v4l2rtsp,甚至使其在启动时自动启动systemctl enable

相关内容