2010-09-01 2 views
1

ПРИМЕЧАНИЕ: Я думал, что использую 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, он не может выйти, оставив глупый скрипт запуска, висящий в списке процессов.

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

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

Нет необходимости использовать 'cat':' echo $$>/var/run/pid/launch-server.pid' –

+0

@ Dennis-Williamson - Хороший улов, спасибо. – Petriborg

ответ

1

Включает ли ваше распределение 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 
+0

Одна из проблем заключается в том, что сценарий переживает демона, а не наоборот :-) Его, вероятно, простая проблема, которую я просто запутываю. – Petriborg

+0

Хотя ваш ответ напрямую не дает мне решение в bash- скажем, я должен сказать, что демон start-stop был на месте и является отличным небольшим программным обеспечением. Я «решил» свою проблему с помощью exec's bash, используя его. – Petriborg

2

теперь я понимаю, что реальная проблема была:

С помощью #!/bin/sh Я не вызывал bash, а тире.

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

Смежные вопросы