バッシュの奇妙な現象

1094 ワード

説明


sshコマンドでCPU使用率の高い90%以上のマシンにリモートログインし、debugモード(-x)でbashスクリプトを実行すると、バックグラウンドに投げ込まれたコマンドの一部が実行されないことがわかります.

ふくばん

  • stressコマンドを使用して、マシンのCPUを90パーセント以上に抑えます.
  • stress --cpu [ ]
    
  • スクリプトtest.sh
  • echo " "
    echo "Hello World!" > tmp.log 2>&1 &
    
  • sshリモート実行コマンド
  • ssh host 'sh -x test.sh'
    

    tmpは生成されませんlogファイル.

    説明する


    私たちがbashでコマンドをバックグラウンドに投げて実行すると、bashは実際にはforkプロセスを出て、このサブプロセスで関連するコマンドを実行することを知っています.Linuxはオペレーティングシステムであり、プロセスの実行にはOSが必要であることも知られています.forkプロセスが出てきたら、そのプロセスがすぐに実行できるかどうかは、プロセスのスケジューリング状況に依存します(具体的にどのようにスケジューリングするかは、深く掘り下げなければなりません).このような奇妙な現象の原因は,sshによってbashスクリプトをdebugモードで実行し,CPUが忙しいときにバックグラウンドのプロセスがすぐに実行されないためである.これで私のtestになりますshスクリプトの実行が完了し、echo "Hello World!" > tmp.log 2>&1というコマンドはまだ実行されていません.なぜならshプロセスはtestの場合、バックグラウンドプロセスと親子関係がある.shのプロセスが終了すると,バックグラウンドプロセスも終了し,コマンドは実行されない.

    解決策


    少し遅れてshの終了時間は、例えばtest.sh最後に:
    sleep 0.01