#bash
#bash
Вопрос:
У меня есть скрипт.
cat /root/test/ddd.sh
#!/bin/bash
s=/root/test/ddd.sh
ps -ef | grep $s | grep -v grep
result=$(ps -ef | grep $s | grep -v grep | wc -l)
echo $result
когда я ее выполняю, результат странный, он показывает, что совпадают две строки.
[root@l2 test]# /root/test/ddd.sh
root 15361 15032 0 09:52 pts/18 00:00:00 /bin/bash /root/test/ddd.sh
2
Ответ №1:
Это потому, что вы используете подоболочку. То есть $(...)
фрагмент вызывает bash fork
, тем самым создавая два (почти) идентичных процесса. Под идентичным я подразумеваю в основном все, кроме идентификатора процесса, идентификатора родительского процесса, кода возврата из fork
, и я не могу придумать ничего другого. Но одна вещь, которая точно остается неизменной, — это командная строка. Оба они будут « /bin/bash /root/test/ddd.sh
«. Итак, внутри result=$(...)
будет ровно один дополнительный процесс, который соответствует.
Вы можете убедиться в этом, например, удалив | wc -l
фрагмент в конце вашего $(...)
и, чтобы сделать его более читаемым, заключите аргумент echo в кавычки:
result="$(ps -ef | grep $s | grep -v grep)"
echo "$result"
Здесь вы увидите, что есть два bash, и PPID одного является PID другого, показывая связь родитель-потомок.