web-dev-qa-db-ja.com

systemdサービス203 / EXECエラーの修正(そのようなファイルまたはディレクトリはありません)

毎日真夜中にbashスクリプトを実行するために、簡単なsystemdタイマーを設定しようとしています。

systemctl --user status backup.serviceは失敗し、次のログを記録します。

backup.service: Failed at step EXEC spawning /home/user/.scripts/backup.sh: No such file or directory.

backup.service: Main process exited, code=exited, status=203/EXEC
Failed to start backup.
backup.service: Unit entered failed state.
backup.service: Failed with result 'exit-code'.

ファイルとディレクトリが存在するので、私は迷っています。このスクリプトは実行可能です。確認するために、アクセス許可を777に設定しました。

背景:

backup.timerおよびbackup.serviceユニットファイルは、/home/user/.config/systemd/userにあります。

backup.timerはロードされてアクティブであり、現在真夜中を待っています。

これは次のようなものです。

[Unit]
Description=Runs backup at 0000

[Timer]
OnCalendar=daily
Unit=backup.service

[Install]
WantedBy=multi-user.target

backup.serviceは次のとおりです。

[Unit]
Description=backup

[Service]
Type=oneshot
ExecStart=/home/user/.scripts/backup.sh

[Install]
WantedBy=multi-user.target

そして最後に、これはbackup.shの言い換えです:

#!/usr/env/bin bash

rsync -a --delete --quiet /home/user/directory/ /mnt/drive/directory-backup/

自分で実行すると、スクリプトは正常に実行されます。

それが重要かどうかはわかりませんが、fishをシェル(.bashrcから開始)として使用します。

役に立つ場合は、完全なスクリプトを投稿させていただきます。

43
dwrz

私は答えを見つけたと思います:

.serviceファイルでは、スクリプトへのパスの前に/bin/bashを追加する必要がありました。

たとえば、backup.serviceの場合:

ExecStart=/bin/bash /home/user/.scripts/backup.sh

とは対照的に:

ExecStart=/home/user/.scripts/backup.sh

理由はわかりません。おそらくfish。一方、メール用に別のスクリプトを実行していますが、サービスファイルは/bin/bashなしで正常に実行されるようです。ただし、default.targetの代わりにmulti-user.targetを使用します。

出会ったチュートリアルのほとんどは/bin/bashを前に付けませんが、それから このSO回答があった を見て、試してみる価値があると考えました。

サービスファイルがスクリプトを実行し、タイマーがsystemctl --user list-timersにリストされているため、うまくいけばうまくいきます。

更新:すべてが現在機能していることを確認できます。

90
dwrz

これが私に起こったのは、私のスクリプトにDOSの行末があり、それが常にスクリプトの上部にあるシバン行を台無しにしていたからです。私はそれをUnixの行末に変更しましたが、うまくいきました。

7
ke4ukz

単純化するために、ExecStartスクリプトの先頭にハッシュバンを追加してください。

#!/bin/bash

python -u alwayson.py    
4
crizCraig

それがスクリプトのコピー/貼り付けである場合、次の行を並べ替えています。

#!/usr/env/bin bash

#!/usr/env/binはありません、あなたは#!/usr/bin/envを意味していました。

2
Ivan Savcic

node.jsアプリをバックグラウンドサービスとして実行するにはどうすればよいですか? からの回答を実際に使用しました。私の場合、不在時に実行できるようにする必要があるDiscordボットを作成していました。

このサービスを導入すると、最初に最初のポスターと同じエラーが発生し、ここに来ました。実行したnode.jsスクリプトの上部に#!/usr/bin/env nodeがありませんでした。

それ以来、問題はありませんが、他にサービス自体に拡張できるものを見たいと思っています。

1
Wirehead

今日もMain process exited, code=exited, status=203/EXECに出くわしましたが、バグは実行可能ファイルをファイルに追加するのを忘れたことです。

0
Karl Pokus