Bashでは、タイムアウトは10秒に設定されます。遅いコマンド
timeout 10 slowcommand
電話が必要な場合は、どのように同じ行動を取ることができるのか疑問に思います。Sudo走るために遅いコマンド、つまり:
timeout 10 sudo slowcommand
これにより時間が制限されます。Sudo、そこではない遅いコマンド...sudoを使ってこれを行うエレガントな方法はありますか?
編集:仮定しましょう停止するsudo で実行できません。
答え1
timeout
シェルまたは他のシェルの組み込み/機能ではありませんbash
(busyboxコマンドがシェルの組み込みと見なすことができるbusybox shを考慮しない限り)。
timeout
通常、互換性のない複数の実装が存在する非標準のスタンドアロンユーティリティです(timelimit
同じ機能を持つユーティリティも存在します)。
存在する:
timeout 10 sudo slowcommand
このユーティリティのGNU実装の現在のバージョン(GNU coreutilsでは、再びGNUシェルとは異なります)timeout
は、10秒以内に完了しない場合はSIGTERMコマンドをbash
実行してsudo slowcommand
独自のプロセスグループに送信します。sudo
ただし、実行中のプロセスがユーザーIDを変更し、sudo
実行するために作成されたプロセスも別のuidで実行されるため、両方のプロセスが実行中のプロセスと同じプロセスグループにあっても、そのプロセスに対する権限はありません。sudo
slowcommand
timeout
timeout
この問題を解決するいくつかの可能な方法があります。権限のないプロセスを実行する代わりに、カーネルがシグナルを送信するように設定できますtimeout
。たとえば、次のように送信することができます。
SIGPIPE
slowcommand
閉じたパイプに書き込む場合:sudo slowcommand | timeout 10 cat
slowcommand
10秒後にstdoutに書き込むと、SIGPIPEが送信されます。(ここで、、、および
cat
はsudo
すべてslowcommand
同じプロセスグループで実行されるため)と同じですtimeout 10 sudo slowcommand | cat
。SIGXCPU
slowcommand
使用されたCPU時間が割り当てられた制限を超える場合:(ulimit -t 10; exec sudo slowcommand)
CPU 時間を 10 秒使用すると
slowcommand
終了します。SIGHUP端末が電話を切って
sudo
セッションリーダーでない場合:timeout 10 script -qfc 'sudo slowcommand; exit' /dev/null
(ここではスクリプトを想定
util-linux
)信号/信号終了。
expect
// /zpty
などを使用して端末をシミュレートし、10秒後に文字を送信してscript
その端末のフォアグラウンドプロセスグループにSIGINTを送信することもできます。screen
^C