Как вывести работу на передний план и разрешить ввод данных пользователем с терминала

213
6bajillion

Аналогично этому вопросу, но по-другому важно: мне нужно запустить несколько заданий из сценария и запустить их в фоновом режиме. Затем, чтобы управлять ими или проверять их прогресс, мне нужно вывести их на передний план и разрешить ввод данных пользователем.

Что я сейчас делаю:

  1. Начните кучу работ в цикле, например

    for ip in $(cat ip-list.txt); do run-job.sh $ip &; done 
  2. Вывести индивидуальную работу на передний план, например, с

    fg 1 

Это выводит задание на первый план, однако есть две проблемы: я не могу предоставить пользовательский ввод - процесс не отвечает, как если бы процесс, получающий мой ввод, был сценарием, запустившим задание, а не самим заданием; также переменная $ ip отображается без оценки, то есть в точности как «$ ip», а не «192.168.1.34». Однако, когда я набираю 'jobs', я вижу все 10 заданий, перечисленных отдельно (но все они выглядят одинаково: "run-job.sh $ ip". Мне нужно использовать ps, чтобы увидеть, какое задание использует какое значение ip.)

Мне бы хотелось, чтобы поведение было таким же, как если бы я начал все эти задания, набрав их по отдельности, а затем нажав control-z, чтобы поместить их в фоновый режим. Если я сделаю это таким образом, когда я выведу их на передний план с помощью fg, они позволят вводить данные пользователем непосредственно в процесс, а также переменная $ ip будет показана с оценкой «192.168.1.34». Тем не менее, ввод вручную заданий не представляется возможным для десятков или десятков заданий.

1
Возможно, запустите их в `screen`. Чтобы развернуть переменную в листинге `jobs`, попробуйте запустить ее с помощью` eval "./run-job.sh $ ip &" ` tripleee 6 лет назад 1
Кроме того, https://mywiki.wooledge.org/DontReadLinesWithFor tripleee 6 лет назад 1
Смотрите также https://serverfault.com/questions/188936/writing-to-stdin-of-background-process tripleee 6 лет назад 0

0 ответов на вопрос