Получение идентификатора процесса из команды, запущенной с помощью «su -c»

9

Я запускаю Java-программу внутри оболочки и записываю идентификатор процесса в текстовый файл. Итак, когда я делаю это:

nohup java app.Main > /dev/null 2>&1 &
echo $! > /var/run/app.pid

Оно работает. Но я действительно хочу запустить его как другой пользователь

su - appuser -c "nohup java app.Main > /dev/null 2>&1 &"
echo $! > /var/run/app.pid

Это не работает Есть ли способ получить идентификатор процесса команды, запущенной с параметром -c?

Prasanth
источник

Ответы:

8

Ты можешь сделать:

su - appuser -c 'nohup java app.Main > /dev/null 2>&1 &
                 echo "$!"' > /var/run/app.pid

(предполагается, что оболочка входа в систему appuserпохожа на Bourne).

su -сбрасывает среду, поэтому, если вы хотите, чтобы переменные раскрывались в командной строке, это должна делать ваша оболочка (не оболочка входа удаленного пользователя), например:

su - appuser -c "nohup '$JAVA_BIN' '$JAVA_CLASS' > /dev/null 2>&1 &"'
                 echo "$!"' > /var/run/app.pid

(предполагается, что эти переменные не содержат одинарных кавычек).

Вы хотите, чтобы перенаправление выполнялось вашей оболочкой (запущенной как root), а не appuserоболочкой (которая, вероятно, не имеет разрешения на запись /var/run).

Стефан Шазелас
источник
2
Спасибо. Это сработало, но мне пришлось немного подправить его для моего случая. По какой-то причине мне пришлось добавить обратную косую черту перед $! а затем мне пришлось передать его в файл tmp из-за проблем с разрешениями. Следующая строка прочитает его из файла tmp и поместит в правильное место. su - appuser -c "nohup $JAVA_BIN $JAVA_CLASS > /dev/null 2>&1 & echo \$! > /tmp/appid.tmp"
Prasanth
@Prasanth, см. Мое редактирование.
Стефан Шазелас