사용자가 터미널에서 프로세스를 실행하는지 알 수 있습니까? 프로그램에서 프로세스를 시작하는 것과 달리 프로그램은 터미널에서 시작됩니다.
사용 사례는 터미널에서 실행된 경우 다음과 같습니다.
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
. 또는 이전을 사용하여 소스를 얻을 때 명령은 다음과 같습니다.메모소스 스크립트 이름은 나열되지 않습니다. 따라서 한 가지 방법은 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