ПРИМЕЧАНИЕ: Я думал, что использую bash, но/bin/sh связан с/bin/dash, у которого есть эта странная проблема с exec.Как найти PID команды dash-exec
У меня есть простой сценарий оболочки bash для Linux, который используется для запуска процесса сервера (который я не писал или не управлял) и хотел бы, чтобы сценарий оболочки bash выводил PID запущенного процесса в pidfile.
Проблема заключается в том, что команда bash-exec не заменяет собственный процесс запущенным серверным процессом!
Итак:
echo $$ | cat > /var/run/launched-server.pid
Это делает не работы, поскольку PID в файле будет состоять в том Баш не серверный процесс. И если серверный процесс выходит из bash, он не может выйти, оставив глупый скрипт запуска, висящий в списке процессов.
Кто-нибудь знает способ использовать Баш (или тире может быть?), Так что:
- Возможно ли это?
- PID запускаемого сервера-сервера будет в моем pidfile?
- Убедитесь, что сценарий bash умрет, когда существует запущенный сервер, и не оставляйте в работе процесса процессы, оставшиеся без посторонней связи.
Edit: Этот фрагмент из bash reference manual быть использованы ...
exec
exec [-cl] [-a name] [command [arguments]]
Если команда подается, он заменяет оболочку без создания нового процесса. Если задана опция -l, оболочка помещает тире в начале нулевого аргумента, переданного команде. Это то, что делает программа входа в систему. Параметр -c заставляет команду запускаться с пустой средой. Если -a предоставляется, оболочка передает имя в качестве нулевого аргумента для команды. Если команда не указана, перенаправления могут использоваться для изменения текущей среды оболочки. Если ошибок перенаправления нет, статус возврата равен нулю; иначе статус возврата не равен нулю.
Edit 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
И некоторые п.с. выход, может быть, более ясно?
[email protected]: ~/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
Нет необходимости использовать 'cat':' echo $$>/var/run/pid/launch-server.pid' –
@ Dennis-Williamson - Хороший улов, спасибо. – Petriborg