2009-12-18 3 views
2

Я хотел бы запускать асинхронную программу на удаленном Linux-сервере неограниченно долго. Этот скрипт ничего не выводит на сам сервер (за исключением того, что он иногда записывает информацию в базу данных mysql). До сих пор единственный вариант, я смог найти это команда поЬир:Как запустить скрипт сервера неограниченно

nohup script_name & 

Из того, что я понимаю, поЬир позволяет команде работать даже после того, как я выйти из моего SSH сессии в то время как «&» характер позволяет команда запускается в фоновом режиме. Мой вопрос прост: это лучший способ сделать то, что я хотел бы? Я просто пытаюсь запустить один скрипт в течение длительных периодов времени, иногда останавливая его, чтобы делать обновления.

Кроме того, если nohup действительно лучший вариант, каков правильный способ прекратить выполнение сценария, когда мне это нужно? Кажется, есть некоторые разногласия относительно того, что является лучшим способом убить процесс nohup.

Благодаря

+0

Какого языка это скрипт, написанные на? Вы против изменения скрипта? Сам скрипт, скорее всего, будет отредактирован, чтобы выполнить то же самое, что и nohup. – charstar

+0

Сценарий написан на Python, и я определенно готов его модифицировать. – pythonBOI

+0

Вы говорите «удаленный сервер Linux», но вы не говорите, является ли это учетной записью общего хостинга. Если это так, ваша хостинговая компания может специально запретить длительные программы, убить их, а затем приостановить свою учетную запись. Например. 1and1.com. –

ответ

0

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

Чтобы ответить вам второй вопрос:

$ nohup ./test & 
[3] 11789 
$ Sending output to nohup.out 

$jobs 
[1]- Running     emacs *h & 
[3]+ Running     nohup ./test & 
$ kill %3 
$ jobs 
[1]- Running     emacs *h & 
[3]+ Exit 143    nohup ./test 

Ctrl + C тоже работает, (посылает SIGINT) как и убить (посылает SIGTERM)

2

Если вы можете изменить сценарий, тогда вы можете поймать сигналы SIGHUP и избежать необходимости в nohup. В Баш скрипт можно было бы написать:

trap " echo ignoring hup; " SIGHUP 

Вы можете использовать ту же технику, чтобы завершить программу: улов, скажем, сигнал SIGUSR1 в обработчике, установить флаг, а затем грациозно выход из основного цикла. Таким образом, вы можете отправить этот сигнал по своему усмотрению, чтобы остановить вашу программу предсказуемым образом.

3

Что вы в основном задаете: «Как создать процесс демона?» То, что вы хотите сделать, - «daemonize», есть много примеров этого, плавающего вокруг в Интернете. Процесс в основном состоит в том, что вы fork(), ребенок создает новый сеанс, родительский выход, дочерний дубликат, а затем закрывает дескрипторы открытых файлов на управляющий терминал (STDIN, STDOUT, STDERR).

Существует пакет, который сделает все это для вас по телефону python-daemon.

Для выполнения грациозных выходов смотрите signal library для создания обработчика сигналов.

Кроме того, поиск в Интернете для «питона демона» вызовет много повторных реализации общего процесса C режим демона: http://code.activestate.com/recipes/66012/

1

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

например: скрипт, запущенный на ящике, который при выполнении 1) берет модель и копирует ее в кастер (удаленный сервер); 2) создает скрипт для запуска моделирования с помощью wodel и нажимает его на сервер; 3) запускается сценарий на сервере и отключить 4) Обязанность сценария таким образом началась, чтобы запустить симуляцию на сервере и после завершения (потребуется несколько дней для завершения) скопировать результаты обратно клиенту.

Я хотел бы использовать следующую команду:

ssh remoteserver 'nohup /path/to/script `</dev/null` >nohup.out 2>&1 &' 

например:

echo '#!/bin/bash 
rm -rf statuslist 
mkdir statuslist 
chmod u+x ~/monitor/concat.sh 
chmod u+x ~/monitor/script.sh 
nohup ./monitor/concat.sh & 
' > script.sh 

chmod u+x script.sh 

rsync -azvp script.sh remotehost:/tmp 

ssh remoteshot '/tmp/script.sh `</dev/null` >nohup.out 2>&1 &' 

Надеется, что это помогает ;-)

Смежные вопросы