次のスクリプトは、バックグラウンドタスクを使用してこれを行う方法を示しています。最初のセクションは、10秒の制限の後に60秒のプロセスを強制終了します。2番目の試みは、すでに終了しているプロセスを強制終了します。タイムアウトを非常に高く設定すると、プロセスIDがロールオーバーして、間違ったプロセスを強制終了する可能性があることに注意してください。ただし、これは理論上の問題です。タイムアウトは非常に大きくする必要があり、多くのプロセスを開始します。
#!/usr/bin/bash
sleep 60 &
pid=$!
sleep 10
kill -9 $pid
sleep 3 &
pid=$!
sleep 10
kill -9 $pid
Cygwinボックスの出力は次のとおりです。
$ ./limit10
./limit10: line 9: 4492 Killed sleep 60
./limit10: line 11: kill: (4560) - No such process
プロセスが終了するまで待つだけの場合は、ループに入って確認する必要があります。sleep 1
他のコマンドは実際には1秒以上かかります(ただし、それほど長くはかかりません)。このスクリプトを使用して、上記の2番目のセクションを置き換えます(「echo $proc
」および「date
」コマンドはデバッグ用であり、最終的なソリューションに含まれるとは思われません)。
#!/usr/bin/bash
date
sleep 3 &
pid=$!
((lim = 10))
while [[ $lim -gt 0 ]] ; do
sleep 1
proc=$(ps -ef | awk -v pid=$pid '$2==pid{print}{}')
echo $proc
((lim = lim - 1))
if [[ -z "$proc" ]] ; then
((lim = -9))
fi
done
date
if [[ $lim -gt -9 ]] ; then
kill -9 $pid
fi
date
基本的にループし、プロセスがまだ毎秒実行されているかどうかを確認します。そうでない場合は、子を殺そうとしないように特別な値でループを終了します。そうでなければ、それはタイムアウトになり、子供を殺します。
sleep 3
これが:の出力です。
Mon Feb 9 11:10:37 WADT 2009
pax 4268 2476 con 11:10:37 /usr/bin/sleep
pax 4268 2476 con 11:10:37 /usr/bin/sleep
Mon Feb 9 11:10:41 WADT 2009
Mon Feb 9 11:10:41 WADT 2009
とsleep 60
:
Mon Feb 9 11:11:51 WADT 2009
pax 4176 2600 con 11:11:51 /usr/bin/sleep
pax 4176 2600 con 11:11:51 /usr/bin/sleep
pax 4176 2600 con 11:11:51 /usr/bin/sleep
pax 4176 2600 con 11:11:51 /usr/bin/sleep
pax 4176 2600 con 11:11:51 /usr/bin/sleep
pax 4176 2600 con 11:11:51 /usr/bin/sleep
pax 4176 2600 con 11:11:51 /usr/bin/sleep
pax 4176 2600 con 11:11:51 /usr/bin/sleep
pax 4176 2600 con 11:11:51 /usr/bin/sleep
pax 4176 2600 con 11:11:51 /usr/bin/sleep
Mon Feb 9 11:12:03 WADT 2009
Mon Feb 9 11:12:03 WADT 2009
./limit10: line 20: 4176 Killed sleep 60