Получить Pid фонового процесса, выполняемого с помощью bash -c - PullRequest
1 голос
/ 17 июня 2019

Мне нужно выполнить программу в фоновом режиме, и программа должна продолжать работать после запуска оболочки.Я выполняю сценарий, используя nohup и bash -c, чтобы он работал в фоновом режиме.

#!/bin/bash
cd /mnt/go/src/github.com/something && pwd && bash -c  "nohup go run apps/something/main.go >> /var/logs/go/crash.log 2>&1 &"

Мне нужно получить pid команды nohup, выполняемой в порожденной оболочке с использованием bash -c, я пытался использовать

 cd /mnt/go/src/github.com/something && pwd && bash -c  "nohup go run 
apps/something/main.go >> /var/logs/go/crash.log 2>&1 & echo $! > /var/run/something.pid"

Но вывод - пустая строка,Есть ли лучший способ решить эту проблему.Из-за использования bash -c я не могу получить PID, используя $?.

1 Ответ

2 голосов
/ 17 июня 2019

Почему вы все связываете с &&? Если вы хотите остановить скрипт в случае возникновения ошибки, просто добавьте set -e ниже шебанга. Он гарантирует, что скрипт прекращает выполнение, если команда возвращает состояние выхода, не равное 0 . Не используйте set -e (читайте ссылку в комментариях).

Как я неправильно прокомментировал в предыдущем редактировании, похоже, что ваш код должен быть корректным с самого начала (thx @tripleee).

Я думаю, что ошибка происходит, потому что вы используете " вместо '. Ошибка возникает из-за того, что Bash сначала должен проанализировать строку, чтобы заменить переменные. Поскольку текущая оболочка не создала дочерний процесс, $! пуст и, следовательно, ваш файл также. Попробуйте с одинарной цитатой:

#! /bin/bash
cd /mnt/go/src/github.com/something
pwd
bash -c  'nohup go run apps/something/main.go >> /var/logs/go/crash.log 2>&1 & echo $! > /var/run/something.pid'
cat /var/run/something.pid
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...