sudoが必要なコマンドでbashタイムアウト機能を使用するには?

sudoが必要なコマンドでbashタイムアウト機能を使用するには?

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で実行されるため、両方のプロセスが実行中のプロセスと同じプロセスグループにあっても、そのプロセスに対する権限はありません。sudoslowcommandtimeouttimeout

この問題を解決するいくつかの可能な方法があります。権限のないプロセスを実行する代わりに、カーネルがシグナルを送信するように設定できますtimeout。たとえば、次のように送信することができます。

  • SIGPIPEslowcommand閉じたパイプに書き込む場合:

    sudo slowcommand | timeout 10 cat
    

    slowcommand10秒後にstdoutに書き込むと、SIGPIPEが送信されます。

    (ここで、、、およびcatsudoすべてslowcommand同じプロセスグループで実行されるため)と同じですtimeout 10 sudo slowcommand | cat

  • SIGXCPUslowcommand使用された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

関連情報