Как выполнить несколько команд с помощью nohup

41

Мне нужно выполнить несколько команд, используя nohup. Каждая команда должна быть выполнена после предыдущей команды.

Я использовал эту команду в качестве примера:

nohup wget $url && wget $url2 > /dev/null 2>&1 &

Однако эта команда не сработала.

Какую команду я должен использовать для этой цели?

Ehsan
источник

Ответы:

56

Оберните это в sh -c:

nohup sh -c 'wget "$0" && wget "$1"' "$url1" "$url2" > /dev/null &
jw013
источник
1
когда я запускаю nohup, я получаю «nohup: игнорирование ввода и перенаправление stderr в stdout», поэтому не является ли «2> & 1» избыточным?
харшвер
1
Вероятно. Я думаю, что когда я написал ответ, я просто скопировал его из вопроса.
jw013
6

Не было бы намного проще создать свой список команд в отдельном файле оболочки, например, command.sh, без какого-либо nohup.

Тогда вы звоните:

nohup bash command.sh
Ассаф
источник
4

Другие уже ответили о nohup. В качестве практического примечания: я рекомендую делать подобные вещи в течение сессии screenили tmuxсессии. Таким образом, вы можете отключиться, а затем подключиться позже и увидеть результат и конечный результат.

Прекратить постоянный вред Монике
источник
1
Этот ответ отлично подходит для интерактивных сценариев, но не имеет смысла для сценариев или автоматизации.
Джонатан Хартли
0

Было бы проще так:

nohup sh -c "wget $url && wget $url2" > /dev/null 2>&1 &

Это, однако, может вызвать проблемы, если URL-адреса содержат специальные символы, поэтому для более безопасного варианта вы можете использовать:

nohup sh -c "wget \"$url\" && wget \"$url2\"" > /dev/null 2>&1 &
Диди Коэн
источник
3
Единственный безопасный способ передачи параметров sh -cосуществляется через отдельные аргументы, которые могут быть доступны с помощью позиционных параметров ( $0, $1, ...). Нет простого или простого способа правильно процитировать аргументы для разбора строки. Ваша попытка использовать экранированные двойные кавычки не удалась, если $urlсама содержит двойные кавычки. Попробуйте a='problem"'; sh -c "echo \"$a\""сами и посмотрите - вы должны получить синтаксическую ошибку, потому что sh -cпытается запустить echo "problem"".
jw013
@ jw013 Из интереса, относится ли ваше возражение в равной степени к принятому ответу от -oh. Тобой. По-видимому, нет. Но я не понимаю, почему нет! :-)
Джонатан Хартли
1
@JonathanHartley Я не уверен, что понимаю ваш вопрос. Если вы тщательно сравните этот ответ с моим, вы должны заметить разницу в способах $urlи способах $url2их использования.
jw013
@ jw013 А, конечно. Я был глупым. Спасибо, что поправили меня.
Джонатан Хартли