シェル .sh スクリプトは、手動で実行しない限り、すべての操作を実行しません。

シェル .sh スクリプトは、手動で実行しない限り、すべての操作を実行しません。

再起動時にシェルスクリプトを実行し、それをcrontabに入れます。

@daily apt-get update && apt-get upgrade -y
@reboot bash /root/Start.sh
@reboot /bin/bash -c 'sleep 10 && /bin/mount -a'
...

シェルスクリプトは他の.pyスクリプトを正常に起動したために実行されますが、内部ですべてのスクリプト(Trouble.pyを除く)を起動するわけではありません。

ただし、シェルスクリプトを直接実行すると、次のようになります。 bash Start.sh

.shのすべてのスクリプトが実行されます。

これは私のシェルスクリプトです。

sleep 15
python3 /root/.../trouble.py > /root/error_log_bash.txt
python3 /root/.../working1.py &
python3 /root/.../working2.py &

私が今まで試したこと:

  • .shの順序変更
  • 睡眠前後の睡眠時間が異なります
  • chmod +x .pyスクリプト
  • 別の同様のスクリプトを実行しましたが、期待どおりに機能しました。
  • error_log_bash.txtを確認しましたが空です。
  • .shでsudoを起動する

他のスクリプトと一緒に使っていて、スクリプトに問題があるのか​​気になります。しかし、手動で作業するので、これを想像するのは難しいです。私は何を逃したことがありませんか?この行動を引き起こす可能性のある要因は何ですか?私はDebianをrootとして使用しています。

#Edit @Waltinator cronと一般環境の違いを指摘してくれてありがとう。手動コンソールを使用してbash /root/Start.shの代わりにsh /root/Start.shを実行すると、エラーは発生しません。

ベストアンサー1

これは答えよりもコメントに近いですが、コメントには行が多すぎます。

  1. あなたの場合に達成したいことはまったく明確ではありません。うまくいかないと説明しましたが、望むものではありません。
  2. あなたが書いたコードのインタプリタを識別する必要があるスクリプトの最初の行がありません。あなたの場合は#!/bin/shこれで十分かもしれません。
  3. 君は捕まえなかった標準エラーから出力されますtrouble.py。これは問題になるかもしれませんが、それをキャッチしないとわかりません。
  4. 両方のバックグラウンドジョブの出力をまったくキャプチャしません。
  5. スクリプトはエラー出力をキャプチャしません。たとえば、python3見つからないと便利な出力が得られません。

以下はサンプル置換スクリプトです。

#!/bin/sh
sleep 15
python3 /root/.../trouble.py  >/root/trouble.log 2>&1
python3 /root/.../working1.py >/root/working1.log 2>&1 &
python3 /root/.../working2.py >/root/working2.log 2>&1 &

以下は、すべての出力を送信するための代替案です(標準出力そして標準エラースクリプトと3つのPythonプログラムの場合)を単一のファイルとしてtrouble.log

#!/bin/sh
sleep 15
exec >/root/trouble.log 2>&1

python3 /root/.../trouble.py
python3 /root/.../working1.py &
python3 /root/.../working2.py &

その後、スクリプトを実行可能にします。呼び出すと大丈夫runitですchmod a+rx runit。これで、次のパスでスクリプトを実行できます。/root/runit

おすすめ記事