bashスクリプトのshebangをからに移行しようとしていますが、#!/bin/bash
この#!/usr/bin/env bash
コードを使用して実行中の既存のインスタンスを確認するため、一部が破損しており、以下でのみ機能します#!/bin/bash
。
$ pidof -x myscript -o %PPID
私が知りたいのは、呼び出されたスクリプトがenv
実行されているかどうかを確認する方法です。私が試したほとんどのソリューションには、汚れた正規表現が含まれており、依然として信頼できないためです。
$ pgrep -f '(^|/)myscript(\s|$)'
私のスクリプトのパスを考えると、/home/user/myscript
上記のコードは次のような不要なコマンドのPIDを返すことができます。
editor /home/user/myscript
bash /tmp/myscript
bash /home/user/myscript with spaces
答え1
Linuxでは、pgrep
疑わしいPIDを取得し、そのPIDの最初のパラメータを確認できます(参考文献に記載されています/proc/$PID/cmdline
)。 ASCII NUL()で区切られた/proc/$PID/cmdline
プロセスのすべてのパラメータ(パラメータ0を含む)を含みます。\0
それは次のとおりです。
pgrep bash | xargs -I {} sed -nz '2{p; q}' /proc/{}/cmdline | grep -Fqzx "$0"
これは、あなたsed
とgrep
線を区切るスペースをサポートすると仮定します。スクリプト名になる対応するsed
ファイル(パラメータ1)の2行目を印刷します。次に、スクリプト名と正確に一致するものを見つけます。で全体のゲームを完了することができますが、引用符を持っていたずらをしたくない。cmdline
grep
sed
別のパスでスクリプトを呼び出すと失敗します。
/home/user/myscript
cd /home; usr/myscript
myscript
ただし、スクリプト名のスペースは安全でなければなりません。