对我来说很奇怪:
我有一个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
答案 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
所以还有一些问题:
服务运行是否正常(类型简单),脚本执行得很好(它确实启动ffmpeg;用ps -ax检查)并且状态视图中仍然出现错误
< / LI>我一直认为在启动脚本时,类型分叉更好,但遗憾的是我无法使其正常工作。
随后:
在bash脚本中有一行如下: 如果! ps -ax | grep [f] fmpeg | grep;然后在后台启动ffmpeg
我在“while true-loop”中放置了那个部分(所有凸轮的运行进程被检查/重新启动),现在它似乎只能用type = simple。奇怪,但工作(似乎是)