2017-11-01 3 views
0

ストレンジを終了します。にsystemdサービスが実行されますが、その後、私のため

私は私のipcamsのレコーディングの世話をするbashスクリプト(cams_record.sh)を持っています。 このスクリプトは、systemd(cams_record.service)によって開始される必要があります。そのサービスファイルは、bashスクリプト(常に実行されているはずです)を処理する必要があります。

私はサービスファイルを作成しましたが、systemdサービスを起動すると、systemdのステータスチェックで示された起動/実行が実行されます。しかし、私は再びステータスをチェックすると、システムのサービスは停止されています。何が間違っているかもしれないか(サービスファイルのf.i.)?

cams_record.serviceを開始する出力以下

とステータスの2回出力:

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

スクリプトが失敗した理由systemdと同じくらいスクリプトを持っています。

ステータスコード1でスクリプトを終了させる条件は何ですか?

スクリプトにログを追加して、スクリプトが終了するまでの時間を確認します。

スクリプトがsystemdの外部で正常に動作していることを確認してから、Why do things behave differently under systemd?を確認してください。

また、networkサービスではなくnetwork-onlineサービスを参照することをお勧めします。スクリプト実行時にネットワークが稼動していることを確認したい場合は、

+0

Thx私はあなたが書いたことを試みますが、私にとってはスクリプトがsystemdの外で実行されるので、CLIから直接実行するのは奇妙です。私はウルの提案を試みたときに報告します。 –

0

@ Mark Stosberg:あなたが書いた/提案したことをしました。

書かれているように、bashスクリプトはCLI(systemd外)で動作し、systemdではスクリプトが最後の前に終了しないと思います。

サービスファイルが変更されました:ネットワーク - >ネットワーク - オンライン。 "&"(ExecStartの終わり)のようなサービスファイル内のさまざまなものを試しました。残念なことに同じ結果です。次に、 "PIDFile ="を追加し、常にMAINPIDエラーを取得します(また、 "&"を再度削除した場合)。

私はサービスファイル(1回目の記事を参照)に戻り、単純にフォークに変更しました。すべてが動いているようだ。私が説明できないのは、実行中のサービスのステータスビューで、「アクティブ終了」と「メインプロセスが終了しました。コード=終了、ステータス= 1/FAILURE」です。私にとっては奇妙な、だって「systemctlは、アクティブ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でチェックされています)。まだステータスビューのエラーが表示されています。

  2. スクリプトを開始すると、フォークのタイプは良くなりましたが残念ですそれを働かせてください。

    その後

: 場合:

bashスクリプトでは次のような行でした! ps -ax | grep [f] fmpeg | grep;その後、ffmpegをバックグラウンドで起動してください

"while true-loop"でその部分(すべてのカムの実行プロセスがチェック/再開されます)を置くと、現在はtype = simpleでしか動作していないようです。奇妙な、しかし働いている(そうであるように)

関連する問題