systemd服务运行但随后退出

时间:2017-11-01 08:12:31

标签: systemd

对我来说很奇怪:

我有一个bash脚本(cams_record.sh),它会处理我的ipcams的录音。 该脚本应由systemd(cams_record.service)启动。该服务文件应该处理bash脚本(应始终运行)。

所以我创建了一个服务文件,但是当我启动systemd服务时:它启动/运行,这是由systemd状态检查显示的。但是,当我再次检查状态时,系统服务已停止。什么可能是错的(服务文件中的f.i.)?

在启动cams_record.service的输出下面然后输出状态的两倍:

systemctl start cams_record

systemctl status cams_record
. cams_record.service - record ipcams
   Loaded: loaded (/lib/systemd/system/cams_record.service; enabled; vendor preset: enabled)
   Active: active (running) since wo 2017-11-01 11:03:53 +03; 39ms ago
 Main PID: 22904 (bash)
   CGroup: /system.slice/cams_record.service
           ??22904 /bin/bash /media/USB2/movie/cams/cams_record.sh
           ??22912 /bin/bash /media/USB2/movie/cams/cams_record.sh
           ??22913 ps -ax
           ??22914 grep [f]fmpeg
           ??22915 grep rtsp://192.168.2.21:554/live/ch00_0
           ??22916 grep \-t 3600

nov 01 11:03:53 Shuttle systemd[1]: Started record ipcams.

systemctl status cams_record
. cams_record.service - record ipcams
   Loaded: loaded (/lib/systemd/system/cams_record.service; enabled; vendor preset: enabled)
   Active: inactive (dead) (Result: exit-code) since wo 2017-11-01 11:03:55 +03; 5s ago
  Process: 22988 ExecStart=/bin/bash /media/USB2/movie/cams/cams_record.sh (code=exited, status=1/FAILURE)
 Main PID: 22988 (code=exited, status=1/FAILURE)

nov 01 11:03:55 Shuttle systemd[1]: cams_record.service: Unit entered failed state.
nov 01 11:03:55 Shuttle systemd[1]: cams_record.service: Failed with result 'exit-code'.
nov 01 11:03:55 Shuttle systemd[1]: cams_record.service: Service hold-off time over, scheduling restart.
nov 01 11:03:55 Shuttle systemd[1]: Stopped record ipcams.
nov 01 11:03:55 Shuttle systemd[1]: cams_record.service: Start request repeated too quickly.
nov 01 11:03:55 Shuttle systemd[1]: Failed to start record ipcams.

使用过的服务文件的内容是:

[Unit]
Description=record ipcams
After=network.target
Requires=network.target
RequiresMountsFor=/media/USB2

[Service]
Type=forking
WorkingDirectory=/media/USB2/movie/cams
ExecStart=/media/USB2/movie/cams/cams_record.sh
RemainAfterExit=yes
SyslogIdentifier=cams_record

[Install]
WantedBy=multi-user.target

2 个答案:

答案 0 :(得分:0)

脚本失败的原因与脚本一样,与systemd一样多。

什么条件会导致您的脚本以状态码1退出?

向脚本添加日志记录,以查看它在死亡前的距离。

确认您的脚本在systemd之外正常运行,然后查看Why do things behave differently under systemd?

此外,如果您想确定脚本运行时网络已启动,请考虑引用network-online服务而不是network服务。

答案 1 :(得分:0)

@Mark Stosberg:我做了你写的/建议的。

好吧,正如所写的那样,bash脚本在CLI中运行(在systemd之外),我认为在systemd中脚本不会在结束之前退出。

我在服务文件中更改了:network - >网络在线。在服务文件中尝试了不同的东西,如“&” (at(End of)ExecStart):遗憾的是同样的结果。然后我添加了“PIDFile =”并且总是收到MAINPID错误(当我再次删除“&”时)。

所以,我回到了服务文件(见第1篇文章),只是将分叉改为简单。似乎一切都在运行。我无法解释的是,在运行服务的状态视图中,我看到:“活动已退出”和“主进程已退出,代码=已退出,状态= 1 /未发送”。对我来说很奇怪,因为“systemctl is-active cams_record.service”给了我:主动:

systemctl status cams_record.service
. cams_record.service - record ipcams
   Loaded: loaded (/lib/systemd/system/cams_record.service; enabled; vendor preset: enabled)
   Active: active (exited) (Result: exit-code) since vr 2017-11-03 09:10:10 +03; 44s ago
  Process: 31355 ExecStart=/media/USB2/movie/cams/cams_record.sh (code=exited, status=1/FAILURE)
 Main PID: 31355 (code=exited, status=1/FAILURE)
   CGroup: /system.slice/cams_record.service
           ??31379 ffmpeg -i rtsp://192.168.2.21:554/live/ch00_0 -r 30 -vcodec copy -an -t 1200 -nostats -nostdin /media/USB2/movie/cams/cam1/cam20171103_0910.mp4

systemd[1]: Started record ipcams.
systemd[1]: cams_record.service: Main process exited, code=exited, status=1/FAILURE

所以还有一些问题:

  1. 服务运行是否正常(类型简单),脚本执行得很好(它确实启动ffmpeg;用ps -ax检查)并且状态视图中仍然出现错误

    < / LI>
  2. 我一直认为在启动脚本时,类型分叉更好,但遗憾的是我无法使其正常工作。

  3. 随后:

    在bash脚本中有一行如下:   如果! ps -ax | grep [f] fmpeg | grep;然后在后台启动ffmpeg

    我在“while true-loop”中放置了那个部分(所有凸轮的运行进程被检查/重新启动),现在它似乎只能用type = simple。奇怪,但工作(似乎是)