мне нужно 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
file и nohup этот файл, но это не обязательно то, что я могу сделать в системе Linux, в которой я должен это реализовать (ограничения привилегий и т. д.).
Самое простое решение: создать сценарий оболочки с
#/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 &
Может быть, обертка bash?
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.