Как найти PID команды dash-exec - PullRequest
       38

Как найти PID команды dash-exec

1 голос
/ 01 сентября 2010

ПРИМЕЧАНИЕ. Я думал, что использую 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?), Чтобы:

  1. Возможно ли это?
  2. PID серверного процесса запущенного сервера будет в моем pidfile?
  3. Убедитесь, что сценарий 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

Ответы [ 2 ]

2 голосов
/ 01 сентября 2010

Теперь я понимаю, в чем проблема real :

Используя #!/bin/sh я не вызывал bash, а dash.

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

1 голос
/ 01 сентября 2010

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

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

Может ли ваша проблема быть решена командой bash 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
...