Як запустити програму як послугу (безшумно)?


23

У мене є сервер на основі python, який я починаю з терміналу. Цей конкретний екземпляр терміналу потім дає контроль над програмою, і програма використовує його як своєрідне вікно журналу, поки воно не закриється. Це нормально, чи я повинен якось намагатися запустити програму якимсь іншим способом, в якому вона буде просто показана як активний процес? Якщо я закрию термінал, з якого я запустив програму, програма загине разом із нею.

Дякую


У цій відповіді згадується PHP, але він стосується і Python: askubuntu.com/questions/26555/running-php-cli-server/…

Відповіді:


9

Навіть старий bash використовує & для надсилання процесів у фоновий режим, але інших способів теж мало. Але основними є два:

1.)$~ your_command > outputfile_for_stdout &
        # runs your command in background, giving you only PID so you can exit that process by `kill -9 PID_of_process`
        # & goes at the end of row      


2.)$~ your_command > outputfile_for_stdout 
        # this will run your program normally
        # press  Ctrl + Z then program will pause
   $~ bg
        # now your program is running in background
   $~ fg
        # now your program came back to foreground
3.)you can run terminal window under screen command so it will live until you either kill it or you reboot your machine
   $~ screen
   $~ run_all_your_commands
       # Ctrl + A + D will then detach this screen
   $~ screen -r will reattach it

Деякі інші корисні команди:

   $~ jobs
        # will show you all processes running right now, but without PID
   $~ ps
        # will show you all processes for actual terminal window

Гмммм, я використовував команду 'top' для перегляду процесів досі
U2ros

Прекрасне рішення. Чи можна змінити параметр 1. так, щоб pid був збережений у файлі. Так генеруються файл журналу та pid-файл.
Огуз Білгіч

27

Перетворіть його на демон (послугу)
daemon --name="yourservicename" --output=log.txt sh yourscript.sh


7
$ servicename &

Використання &змушує програму працювати у фоновому режимі, а не блокувати оболонку, поки програма не закінчиться.


Ні, це не так. Напр. dixon@dixon-vaio:~$ nautilus & [1] 11835. Він повертає ідентифікатор процесу, і ви отримаєте новий запит оболонки. Також перевірте це: http://unix.stackexchange.com/questions/3886/difference-between-nohup-disown-and .
dixoncx

1
Я стою виправлений. Відхилення голосування видалено.
Скотт Северанс


0

З терміналу ви також можете запустити screenабо продовжити командування &. Простий спосіб запускати безперервні процеси.


просто використовувати &для тла процес у цьому випадку, на мій погляд, мало. ОП заявляє, що його сервер входить в stdout, тому &його термінал буде захаращений виведенням. Оскільки ОП згадує про закриття терміналу , ОП не зможе знову передбачити процес і весь журнал-вихід буде втрачений. Краще, принаймні, перенаправити його на файл журналу або дотримуватися screenналаштування - але тоді, будь ласка, поясніть основи screenOP (від'єднати / приєднати / тощо)
Роберт Ридл,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.