nohup несколько последовательных команд

Мне необходимо nohup две команды, одна за другой. Вторая команда должна быть выполнена ПОСЛЕ первой команды. Вот команды:

tar -zcf archive.tar.gz.tmp mydir
mv archive.tar.gz.tmp archive.tar.gz

Мне нужны команды для запуска в фоновом режиме, но, очевидно, не обе одновременно. Вторая команда должна быть выполнена после завершения первой команды. Я попробовал это:

nohup tar -zcf archive.tar.gz.tmp mydir ; mv archive.tar.gz.tmp archive.tar.gz > /dev/null 2>&1 &

но команды не работают в фоновом режиме. Приглашение bash ждет, пока две команды не будут выполнены, прежде чем дать мне другое приглашение. Мне нужно, чтобы они работали в фоновом режиме.

Если я сделаю:

nohup tar -zcf archive.tar.gz.tmp mydir > /dev/null 2>&1 &

Это отлично работает на заднем плане. Это только когда я пытаюсь выполнить более одной команды.

Я также попробовал:

nohup tar -zcf archive.tar.gz.tmp mydir > /dev/null 2>&1 & ; mv archive.tar.gz.tmp archive.tar.gz > /dev/null 2>&1 &

Но это тоже не сработало. Неверный синтаксис или что-то. Я уверен, что есть способ сделать это, но я просто не уверен в синтаксисе.

Единственная альтернатива, которую я могу придумать, - это поместить команды в .sh файл и nohup этот файл, но это не обязательно то, что я могу сделать в системе Linux, я должен реализовать это (ограничения привилегий и т. д.).

4 ответа

Решение

Самое простое решение: создать сценарий оболочки с

 #/bin/sh
 tar -zcf archive.tar.gz.tmp mydir
 mv archive.tar.gz.tmp archive.tar.gz

И использовать nohup myscript, Возможно с некоторой дополнительной документацией в сценарии.

(Да, я не люблю документацию. Особенно при работе с несколькими людьми или когда вы можете когда-нибудь уйти с работы, и ваш преемник должен выяснить, почему ".)


Альтернативой может быть запуск новой оболочки для подзадачи (в этом случае ваш tar и move)

nohup `$ (tar -zcf archive.tar.gz.tmp mydir; mv archive.tar.gz.tmp archive.tar.gz)


Альтернатива 2:

nohup ``tar -zcf archive.tar.gz.tmp mydir; mv archive.tar.gz.tmp archive.tar.gz```.

Я действительно предпочитаю сценарий, хотя. Комментарии в нем могут быть весьма полезными, когда вы или кто-то еще посмотрите на его сценарий через несколько лет и задаетесь вопросом, почему это было сделано таким образом.

На несвязанном примечании: Как, черт возьми, я могу опубликовать ансер с обратным трюком в нем? (Команда для оболочки 'использовать эту команду; передать вывод другой команде в качестве ввода`).

Я думаю, вам нужны скобки.

nohup $(tar -zcf archive.tar.gz.tmp mydir; mv archive.tar.gz.tmp archive.tar.gz) >/dev/null 2>&1 &

Может быть, обертывание?

nohup bash -c 'tar -zcf archive.tar.gz.tmp mydir > /dev/null 2>&1 ; mv archive.tar.gz.tmp archive.tar.gz > /dev/null 2>&1' &

Вы можете использовать screen отдать команды и отсоединиться от экрана сеанса:

screen
tar -zcf archive.tar.gz.tmp mydir && mv archive.tar.gz.tmp archive.tar.gz
ctrl-a d to detach

Команды будут работать как с nohup.

Другие вопросы по тегам