Запуск и уничтожение Java-приложения с помощью сценария оболочки (Debian) - PullRequest
6 голосов
/ 16 января 2012

Я новичок в UNIX. Я хочу запустить свое Java-приложение с помощью скрипта, подобного так:

#!/bin/sh
java -jar /usr/ScriptCheck.jar &
echo $! > /var/run/ScriptCheck.pid

Это якобы работает. Он запускает приложение и пишет файл pid. Но когда я пытаюсь остановить процесс с помощью другого скрипта, который содержит это:

#!/bin/sh
kill -9 /var/run/ScriptCheck.pid

консоль выдаёт мне эту ошибку:

bash: kill: /var/run/ScriptCheck.pid: arguments must be process or job IDs

Мое лучшее предположение, что я не пишу правильный код в скрипте остановки, возможно, не даю правильную команду для открытия файла .pid. Буду очень признателен за любую помощь.

Ответы [ 5 ]

12 голосов
/ 16 января 2012

Вы передаете имя файла в качестве аргумента kill, когда он ожидает номер (идентификатор процесса), поэтому просто прочитайте идентификатор процесса из этого файла и передайте его kill:

#!/bin/sh 
PID=$(cat /var/run/ScriptCheck.pid) 
kill -9 $PID
2 голосов
/ 16 января 2012

Ваш синтаксис неправильный, kill принимает идентификатор процесса, а не файл. Вам также не следует использовать kill -9, если вы абсолютно не знаете, что делаете.

kill $(cat /var/run/ScriptCheck.pid)

или

xargs kill </var/run/ScriptCheck.pid
2 голосов
/ 16 января 2012

Быстрый и грязный метод будет:

kill -9 $(cat /var/run/ScriptCheck.pid)
0 голосов
/ 16 января 2012

Мне никогда не приходилось создавать свой собственный pid;Ваш вопрос был интересным.

Вот фрагмент кода bash, который я нашел:

#!/bin/bash

PROGRAM=/path/to/myprog
$PROGRAM &
PID=$!
echo $PID > /path/to/pid/file.pid

Для размещения файла file.pid в / var / run --referenced вам потребуются права root.по многим статьям - вот почему у демонов есть привилегии root.

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

$ PROGRAM & переводит скрипт в фоновый «пакетный» режим.

Есливы хотите, чтобы программа зависала после выхода из вашего скрипта, я предлагаю запустить его с nohup, что означает, что программа не умрет, когда ваш скрипт выйдет из системы.

Я только что проверил.PID возвращается с nohup.

0 голосов
/ 16 января 2012

Я думаю, вам нужно прочитать содержимое файла ScriptCheck.pid (который, как я предполагаю, содержит только одну запись с PID процесса в первой строке).

#!/bin/sh
procID=0;
while read line    
do    
    procID="$line";
done </var/run/ScriptCheck.pid
kill -9 procID
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...