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