ユーザーが端末でプロセスを実行しているかどうかはわかりますか?プログラムでプロセスを開始するのとは異なり、プログラムは端末で開始されます。
ユースケースは、端末で実行されている場合は次のとおりです。
suman:
suman:
suman:
しかし、他のプログラムxによって実行され、xがstdout / stderrの前に何かを追加すると、次のようになります。
x: suman:
x: suman:
しかし、私はこれを検出して次のようになりたいと思います。
x:
x:
x:
答え1
問題のあるプロセスの親プロセスID(PPID)を表示し、PPIDを使用して、そのプロセスがシェルで実行されているのか、他のプログラムで実行されているのかを確認できます。
たとえば、プロセスが実行されている内容を確認するには、sleep
そのPPIDを照会します。
$ ps -ef | grep "sleep"
user 2470 1996 0 06:30 pts/1 00:00:00 sleep 60
PID 1996はプロセスのPPIDですsleep
。grep
今始めましょう。
$ ps -ef | grep 1996
user 1996 1995 0 05:57 pts/1 00:00:00 bash
PID 1996はプロセスbash
をよく表すシェルです。sleep
可能端末で実行してください。さらに一歩進むには、grep
プロセスのPPIDを取得できますbash
。
$ ps -ef | grep 1995
user 1995 448 0 05:57 tty1 00:00:00 /usr/bin/urxvt
プロセスのPPIDは仮想端末bash
です。urxvt
したがって、sleep
コマンドは端末で実行されます。
答え2
。または、以前を使用してソースを取得する場合、コマンドは次のようになります。メモソーススクリプト名はリストされません。したがって、1つの方法は、grepを実行してps出力にソーススクリプト名が含まれていることを確認して、ソーススクリプトではないことを示すことです。
例: 「myscript」ファイルに次のコマンドがあるとします。
cd /run/user/1000 #it will only affect terminal pwd if is sourced!
直接実行する場合:
$ myscript # ps will contain 'myscript' in the list.
# The cd command will not change the terminal current directory (pwd)
それ以外の前に「source」またはドット(.)を使用する場合:
$ . myscript # ps will not list "myscript" as it was sourced
$ source myscript # source works the same as .
# Your terminal pwd will change to /run/user/1000
適用するには、「myscript」を変更します。
ck=`ps | grep -o -m 3 -E 'myscript'`
cd /run/user/1000
if [ -n "$ck" ]; then # -n means "not empty"
printf "\E[07;91mYou must source the script, run . myscript\E[0m\n"
exit
fi
# or negative logic ...
if [ -z "$ck" ]; then # -z means null, empty
echo "You are runnig the sourced script, now run pwd to check it"
fi