バックグラウンドで無限ループを実行する方法


17

スクリプトの実行を続けながら、バックグラウンドで無限ループを実行するにはどうすればよいですか?

「スクリプト」の例:

while true; do something_in_the_background; done

do_something_while_the_loop_goes_on_in_the_background

for 1 2 3; do somethingelse; done

exit 0

これ(に注意&)は、しばらくしてシステム全体をクラッシュさせるようです:

while true; do
  something_in_the_background &
done

do_something_while_the_loop_goes_on_in_the_background

for 1 2 3; do somethingelse; done

exit 0

多くのプロセスを作成していることに驚かないでください。
エドはヒール

フォーク爆弾の道順を尋ねていますか?
バージガル

1
バックグラウンドで無限ループを実行する背後にある意図を教えてください。
ニューロン

回答:


31

&ループの内側では、最初のプロセスが終了するのを待たずに、バックグラウンドで新しいプロセスをできる限り早く開始します。代わりに、ループをバックグラウンドに入れたいと思うので&、ループ自体を

while /bin/true; do
    something_in_the_background
done &

# more stuff

10
while : ; do something ; done &
  • 以前のBourneシェルには組み込みコマンドがtrueありませんでしたfalsetrue代わりに、単に:、およびのfalseようなものにエイリアスされましたlet 0

  • & 行の最後にプロセスの背景があります

  • : 「help:」で説明されているように、nullコマンドです。 No effect; the command does nothing. Exit Status: Always succeeds.

2
あなたの答えはそれを説明することで大いに改善されます-OPは何を:意味するのか分からず、おそらくあなたが&最後まで動かした理由を知らないかもしれません。また、間隔を変更して1ライナーにすることは紛らわしいだけです。これは目に見えますが、まったく重要ではない変更です。
デロバート

レビューに従って投稿を編集しました
ジョン

0

たとえば、0.1秒または.01秒のスリープを設定すると、ループのCPUフレンドリが向上します。しかし、Eric Renoufが指摘したように、&はループの内側ではなく、ループの最後になければなりません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.