子ではなくスクリプトが実行可能ファイルとして表示されるようにコマンドをラップするにはどうすればよいでしょうか?

子ではなくスクリプトが実行可能ファイルとして表示されるようにコマンドをラップするにはどうすればよいでしょうか?

メモリ使用量を制限するためにR スクリプトをラップしました/usr/lib/R/bin/exec/R。名前を に変更し、次の内容で/usr/lib/R/bin/exec/R_orig名前が付けられた bash スクリプトを作成しました。/usr/lib/R/bin/exec/R

#!/bin/bash
echo "Memory limited to 10G"
ulimit -Sv 10000000 #limit memory for 64-bit version
/usr/lib/R/bin/exec/R_orig "$@"

これは、この特定のプログラムに関する私の経験の大きな改善ですが、一部の部分では、パッケージのインストール パスを決定するために実行可能ファイル名が実際に使用されており、実行可能ファイル名が変更されているために失敗することがわかりました。

スクリプトを/usr/lib/R/bin/exec/Rそれ自体の実行可能ファイルとして表示することは可能ですか? たとえば、top別の子プロセスR_origではなく、プロセスのみを表示しますかR?

答え1

そうしないでください。元の文字列をR標準出力に文字列を出力するものに置き換えると、その出力を解析するアプリケーションが混乱する可能性があります。

代わりに、新しい名前でラッパー スクリプトを作成し、元の実行可能ファイルはそのままにしておきます。このスクリプトは、(すべてのユーザーがアクセスできるようにする必要がある場合)のような場所Rに配置しないでください。これにより、後でパッケージのアップグレードやアンインストール スクリプトを混乱させることもなくなります。/usr/lib/R/bin/exec/usr/local/bin

あるいは、シェルの起動ファイルでシェル関数を定義することもできます。

myR () (
    echo "Memory limited to 10G"
    ulimit -Sv 10000000 #limit memory for 64-bit version
    exec /usr/lib/R/bin/exec/R "$@"
)

~/.bashrcもう 1 つの明らかなオプションは、シェルの初期化スクリプト ( )で制限を設定することですbash。制限は、シェルから開始されたすべてのプロセスに引き継がれます。

答え2

質問の答えを得るために、スクリプトの最後の行を次のように変更してください。

exec -a "$0" /usr/lib/R/bin/exec/R_orig "$@"

これにより、R_orig をスクリプトの子として実行するのではなく、現在のプロセス (スクリプトを実行しているシェル) を R_orig プログラムに置き換えます。さらに、プログラムの名前 (従来の最初の引数) を元の名前として渡します。パッケージのインストールを検索するほとんどのプログラムは、この最初の名前を使用します。

「メモリは 10G に制限されています」というメッセージを出力するのは良くないという @Kusalananda の意見には私も同意します。これを実行する場合は、stderr に出力してください。つまり、スクリプトは次のようになります。

#!/bin/bash
echo "Memory limited to 10G" >&2
ulimit -Sv 10000000 #limit memory for 64-bit version
exec -a "$0" /usr/lib/R/bin/exec/R_orig "$@"

関連情報