web-dev-qa-db-ja.com

他のアプリケーションを使用してスクリプトでulimitを実行する方法

ラボには次のスクリプト(CentoS 6)があり、出力を1つずつ使用してアプリケーションを実行します。

cd A/
sleep 1
gnome-terminal -t A --tab -e "./app1"
cd ../B/
sleep 1
gnome-terminal -t b --tab -e "./app2" 
sleep 2
gnome-terminal -t c --tab -e "./app3"

これは完璧に機能しています。

ここで必要なのは、アプリケーションの1つ(つまりapp3)のコアダンプファイルを生成することです。ulimit -cはデフォルトで0を表示しますが、デフォルト値を変更したくありません。

gnome-terminal -t c --tab -e "ulimit -c unlimited ; ./c"が機能していません。グーグルがスクリプトを実行するためにそれが必要であるとわかったとき、sh -c "ulimit -c unlimited"

gnome-terminal -t c --tab -e "sh -c "ulimit -c unlimited"は完璧に機能しています。
だが、
gnome-terminal -t c --tab -e "sh -c "ulimit -c unlimited ; ./app3"が機能していません。

App3のみのコアダンプを有効にするにはどうすればよいですか? 注:これはグローバルには必要ありません。

2
Tejas

これを行うには3つの方法があります。

適切なチェーンロードコマンドを使用します。

Shell組み込みコマンドulimitを使用する代わりに、この目的のために開発されたコマンドを使用してください。 さまざまなdaemontools-familyツールセット

したがって、例としてnoshツールセットのsoftlimitを使用して、実行します。

gnome-terminal -t A --tab -e "softlimit--coresize無制限./app1"

スクリプト内でサブシェルを使用します。

これにより、ターミナルエミュレータプロセスにも制限が適用されます。この場合、これはかなり良性です。ただし、オープンファイルハンドル制限やプロセスフォーク制限などの他の制限を適用している場合、これは問題になる可能性があります。

(ulimit-c無制限; urxvt -e "./app1")

これはGNOMEターミナルまたはUnicode RXVTのクライアントサーバーバリアントでは機能しないことに注意してください。どちらも、スクリプトの子としてターミナルエミュレータを直接呼び出すことはありません。これらはサーバープロセスを介してリモート呼び出しを実行しますが、スクリプトで設定されたリソース制限はありません。

GNOMEターミナルにulimitを実行するシェルを実行させます。

これを下から上に構築する必要があることを忘れないでください。

  1. 作業を行う実際のシェルでコマンドリストを実行する必要があります
    ulimit-c無制限; exec "./app1"
  2. このコマンドリストをshに渡すには、-cの後にすべて1つの引数である必要があるため、引用符で囲む必要があります。
    sh -c "ulimit-c無制限; exec \" ./ app1\""
  3. sh呼び出しをGNOMEターミナルに渡すには、それも-eの後にすべて1つの引数である必要があります。引用のレベルを適用する必要があります:
    gnome-terminal -e'sh -c "ulimit-c無制限; exec \" ./ app1\"" '
2
JdeBP

ulimit -cはハード制限を提供しませんが、ソフト制限を提供します。ハード制限はスーパーユーザーのみが変更でき、ソフト制限は誰でも変更できます。ソフト制限の変更は、そのプロセスにのみ影響します。

MacOSの場合:

$ charlie on macbook in ~
❯❯ ulimit -aS
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
file size               (blocks, -f) unlimited
max locked memory       (kbytes, -l) unlimited
max memory size         (kbytes, -m) unlimited
open files                      (-n) 7168
pipe size            (512 bytes, -p) 1
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 709
virtual memory          (kbytes, -v) unlimited

$ charlie on macbook in ~
❯❯ ulimit -aH
core file size          (blocks, -c) unlimited
data seg size           (kbytes, -d) unlimited
file size               (blocks, -f) unlimited
max locked memory       (kbytes, -l) unlimited
max memory size         (kbytes, -m) unlimited
open files                      (-n) unlimited
pipe size            (512 bytes, -p) 1
stack size              (kbytes, -s) 65532
cpu time               (seconds, -t) unlimited
max user processes              (-u) 1064
virtual memory          (kbytes, -v) unlimited

あなたの場合、ハード制限はおそらく無制限であり、ソフト制限はデフォルトで0です。 ulimitを使用するか、/proc/FD/limitsファイルを直接編集することにより、そのプロセスのソフト制限を変更できます。

0
Charles Addis