Возможно, специфично для -Linux, другие /proc
могут вести себя по-другому, но в Linux вы можете сделать это:
( # subshell to preserve CWD
cd /proc/$pid || exit
[ "$expected_path" = "$(readlink exe)" ] || exit # optional, and can do more checks
while [ -d. ]; do sleep 1; done
)
Рабочий каталог перестанет быть действительным (, и этот .
больше не будет существовать )после завершения процесса. Однако, если новый процесс принимает этот pid, он не снова становится действительным. Если процесс завершается (, а pid остается неиспользованным )до cd
, тогда cd
завершается ошибкой, и подоболочка завершает работу. Если pid был повторно -использован до cd
, то это будет успешно, но «необязательные» проверки (спасибо LJKims ), надеюсь, поймают его. Итак, пока чеки фиксируют эту очень короткую возможную гонку, условия гонки нет. Для проверки вы можете использовать что-то вроде:
# shell 1
$ sleep 10 &
[1] 26453
$ cd /proc/26453
# shell 2 (must be bash for BASHPID)
for ((i=0; i<200000; ++i)) do ( if [ 26453 -eq $BASHPID ]; then echo "I am have the pid — sleeping 60"; sleep 60; echo "done sleeping"; fi ); done
I have the pid — sleeping 60
# back to shell 1
[ -d. ]; echo $?
1
Таким образом, он по-прежнему замечает, что интересующий его сон вышел, несмотря на новый pid 26453.
В Apache вы бы назвали это vhost
. Nginx на самом деле не имеет этого, он называется серверным блоком.
Вы можете прочитать больше в документации по адресуhttps://www.nginx.com/resources/wiki/start/topics/examples/server_blocks/
В частности, вам нужно добавить это в свой конфиг:
server {
server_name myfun.fun;
access_log logs/myfun.fun.access.log main;
root /var/www/myfun.fun/htdocs;
}
Конечно, вам необходимо зарегистрировать доменное имя myfun.fun и предоставить записи DNS, указывающие на ваш сервер nginx.