Bash Daemon с именем "sh" или "sleep", а не именем файла - PullRequest
2 голосов
/ 05 декабря 2009

Я создал простой bash-скрипт chmod + x и успешно запускаю его в качестве фоновой службы.

Но сценарий называется "sh" или "sleep", или какая-то другая команда, которая запускается в данный момент, а не имя моего сценария, когда я просматриваю список процессов.

Как мне назвать процесс моего bash-скрипта, чтобы я мог его различить? Я хочу быть уверен, что я не запускаю скрипт более одного раза.

Я очень новичок в написании сценариев bash ... извините, если это глупый вопрос.

Я использую #! / Bin / bash

Ответы [ 4 ]

2 голосов
/ 05 декабря 2009

У вас есть "шебанг" в вашем сценарии?

Я только что сделал небольшой тест. Я обнаружил, что без шебанга тестовый скрипт показывал в ps как какую бы команду ни выполняла в то время . Однако, если я, как я обычно делаю, поставлю:

#!/bin/bash

или

#!/bin/sh

(который в моей системе символически связан с /bin/dash) в качестве первой строки в сценарии, затем сценарий обнаружил под своим собственным именем в выводе ps.

1 голос
/ 05 декабря 2009

Ваша родительская оболочка будет работать все время. Это будет ш. Любые другие процессы, порожденные этой оболочкой, также будут запущены. Попробуйте pstree, чтобы показать отношения родитель-ребенок.

Кстати, если вы используете специфичные для bash функции, которых нет в оболочке POSIX Bourne, вы должны использовать #! / Bin / bash, а не #! / Bin / sh. Некоторые системы имеют bash, но имеют более легкий вес /bin/sh.

Я очень новичок в написании сценариев bash ... извините, если это глупый вопрос.

Не тупой. Базовый, но только после того, как вы поймете, как работают процессы Unix (и как бы вы ни использовали в OS X, которая показывает вам «служебные» имена, поскольку это не то слово, которое имело бы смысл в любом контексте Unix в этой ситуации). ты имеешь дело с большим количеством сложности, и я не виню тебя за то, что ты спрашиваешь.

Может быть, OS X смотрит на лидеров групп процессов или что-то подобное, чтобы придумать «имя службы», если так оно и называется. Я думаю , что было бы именем процесса любого процесса, выполняющегося на переднем плане (то есть, что вы не отключили его с & в конце, поэтому оболочка ждет его перед выполнением следующего команда.)

1 голос
/ 05 декабря 2009

Так как ps также показывает, что у меня есть предчувствие, тебе не повезло. Извините, но сценарии оболочки не могут изменить свое видимое имя процесса.

Однако, для случаев, которые показывают bash, вы можете создать символическую ссылку на bash под именем, описывающим ваш сценарий, и вызывать ваш сценарий через эту символическую ссылку.

0 голосов
/ 05 декабря 2009

Не знаю, насколько портативным будет мое решение, но оно работает в Linux.

Если вы действительно хотите это сделать (возможно, вы хотите убить свой процесс, просматривая его по имени), вы можете написать небольшую программу на C для вызова в оболочку с другим именем процесса. Например, ...

#include <unistd.h>
#include <stdio.h>

int main(int argc, char **argv)
{
   if (argv[1])
   {
      argv[0] = argv[1];
      return execvp("sh", argv);
   }
   else
   {
      fprintf(stderr, "usage: %s <script> [args]\n", argv[0]);
      return 1;
   }
}

Скажем, это называется wrapper.c. Вы можете скомпилировать с:

gcc -o wrapper wrapper.c

Тогда вы можете запустить:

./wrapper ./my-script

И отметьте top или ps. У него должно быть «поддельное» имя программы ..

Теперь ... Вы действительно хотите это сделать? Я не знаю. Это, вероятно, не стоит того. Большинство людей не заботятся о подобных вещах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...