Как найти PID команды Dash-Exec
-
26-09-2019 - |
Вопрос
Примечание: я думал, что я использую 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 может быть?) Так что:
- Является ли это возможным?
- PID Server Server Server будет в моем PIDFile?
- Убедитесь, что скрипт 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
С самого начала будет работать, как ожидалось.