Вопрос

Примечание: я думал, что я использую Bash, но / bin / sh связан с / bin / dash, который имеет эту странную проблему Exec.

У меня есть простой скрипт Shell Shell на Linux, который используется для запуска процесса сервера (который я не писал или не контролирует) и хотел бы, чтобы скрипт Shell Shell выводится в PIDFILE.

Проблема в том, что команда Bash-Exec не заменяет свой собственный процесс с запущенным процессом сервера!

Так:

echo $$ | cat > /var/run/launched-server.pid

Это делает нет Работа, потому что PID в файле будет так, чтобы Bash не серверный процесс. И если в процессе сервера выходит Bash, может не выйти, оставив глупый запуск скрипта, висящий в списке процессов.

Кто-нибудь знает способ использовать Bash (или Tash может быть?) Так что:

  1. Является ли это возможным?
  2. PID Server Server Server будет в моем PIDFile?
  3. Убедитесь, что скрипт Bash умрет, когда запускаемый сервер существует, а не оставляет несущественные процессы оболочки, висящие в списке процессов?

Редактировать: этот фрагмент от Справочное руководство Bash быть полезным ...

exec
           exec [-cl] [-a name] [command [arguments]]

Если прилагается команда, она заменяет оболочку без создания нового процесса. Если прилагается опция -l, оболочка помещает тире в начале аргумента Zeroth, переданный команду. Это то, что делает программа входа в систему. Опция -C приводит к выполнению команды с пустой средой. Если поставляется, оболочка проходит имя в качестве аргумента Zeroth для команды. Если команда не указана, перенаправления могут быть использованы для влияния на текущую среду оболочки. Если нет ошибок перенаправления, возвратный статус равен нулю; В противном случае возвратный статус не равен нулю.


Редактировать 2: Это скрипт (санитарный):

#!/bin/sh

# this is where the server expects to run its services for Daemontools
SERVICE_DIR='/var/service';

# kill stdout, stderr, stdin
exec </dev/null
exec >/dev/null
exec 2>/dev/null

logger -ip daemon.debug -- stdout, stderr, stdin redirected to /dev/null

if [ -d $SERVICE_DIR ]; then
    # sanitized...
    logger -ip daemon.debug -- services and supervisors exited
else
    logger -ip daemon.err -- $SERVICE_DIR does not exist, exiting
    exit 1;
fi

if [ -d /var/run/pid ]; then
    echo $$ | cat > /var/run/pid/launched-server.pid
    logger -ip daemon.debug -- creating launched-server pidfile
fi

# start the server process
logger -ip daemon.info -- launching server on $SERVICE_DIR
exec /usr/local/bin/launched-server

И некоторые PS вывод, возможно, быть более понятным?

me@chainsaw: ~/dev $ ps ax | grep launched-server
13896 pts/1    S+     0:00 /bin/sh ./server_boot
13905 pts/1    S+     0:00 launched-server /var/service
13938 pts/2    R+     0:00 grep --color=auto launched-server
Это было полезно?

Решение

Включает ваше распределение start-stop-daemon(8)? Удивительно полезный маленький инструмент, он был построен специально для запуска демонов из сценариев оболочки. (Конечно, демоны внедряют сценарии оболочки, поэтому он не может быть идеальным совпадением - это зависит от того, почему вы хотите, чтобы оболочка пережить ваш демон.)

Или для чего-то проще:

Может ли ваша проблема была решена с Bash's exec команда? Он заменяет процесс оболочки любую программу, которую вы просите выполнить:

#!/bin/bash

echo $$ > /tmp/pidfile
exec /bin/sleep 60

$ ./show_exec.sh 
[nothing happens]

И, в другой оболочке:

$ cat pidfile
24686
$ ps auxw | grep 24686
sarnold  24686  0.0  0.0   9728   816 pts/1    S+   04:53   0:00 /bin/sleep 60

Другие советы

Теперь я понимаю, что настоящий Проблема была:

Используя #!/bin/sh Я не был призывает Bash, но тире.

Dash exec - это оболочка с проблемой Exec. Если бы я использовал #!/bin/bash С самого начала будет работать, как ожидалось.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top