터미네이터 터미널에서 여러 백그라운드 프로세스를 생성한 다음 bash에서 종료하는 방법

터미네이터 터미널에서 여러 백그라운드 프로세스를 생성한 다음 bash에서 종료하는 방법

새 터미네이터 터미널을 생성한 다음 각 터미널에서 프로세스를 실행하는 배치 스크립트를 작성하려고 합니다. 나는 그들을 죽이기로 결정할 때까지 백그라운드에서 계속 실행되기를 원합니다.

첫 번째 프로세스가 10초 동안 실행되고 그 동안 다른 종료된 프로세스가 많이 생성되기를 원합니다.

첫 번째 부분은 여전히 ​​작동 중이지만 이제 끝에서 Enter 키를 누르고 시작하는 모든 프로세스에 SIGINT를 보낼 수 있기를 원합니다. 이 목적에 맞는 명령을 찾을 수 없습니다.

#!/bin/sh
echo "Running Teleop... (MAY TAKE SEVERAL SECONDS TO INITIALIZE)"

terminator -T "gazebo" -e "roslaunch cob_bringup_sim robot.launch 
robot:=cob4-8 robot_env:=ipa-apartment; bash" &

#wait 10 secons before starting nav and rviz otherwise will get error
((sleep 10) &&
(terminator -T "navigation" -e "roslaunch cob_navigation_global 
2dnav_ros_dwa.launch robot:=cob4-5 robot_env:=ipa-apartment; bash" &
terminator -T "rviz" -e "roslaunch cob_navigation_global rviz.launch; 
bash" &
terminator -T "arm_controller" -e "roslaunch cob_moveit_bringup 
demo.launch rviz_tutorial:=true robot:=cob4-8; bash" &
terminator -T "control_nodes" -e "cd catkin_ws; rosrun first_pkg 
control_nodes; bash" &
terminator -T "controller" -e "cd catkin_ws; rosrun first_pkg 
controller; bash" &
terminator -T "joystick" -e "rosrun joy joy_node; bash" &
#spawn objects
terminator -T "spawn_objects_launch" -e "roslaunch 
cob_default_env_config upload_object_locations.launch robot_env:=ipa- 
apartment; rosrun cob_bringup_sim spawn_object.py tomato_sauce; 
bash")) &

(
echo Press any key to to shutdown all processes
read varname
echo Shutting down...
#terminating all child processes
)

이것은 ROS 명령이지만, 이 맥락에서는 일반 명령과 다르지 않다고 생각합니다. 코드가 매우 혼란스럽다는 것을 알고 있습니다. 다른 문제를 발견하면 기꺼이 알려드리겠습니다. 감사해요!

답변1

비대화형(예: 스크립트에서)으로 실행될 때 bash는 작업 제어를 비활성화하므로 간단한 방법을 사용하여 백그라운드 프로세스를 종료할 수 있습니다.모든 백그라운드 작업 종료또는Bash에서 모든 작업을 종료하는 방법은 무엇입니까?기본적으로 작동하지 않습니다.

내가 할 첫 번째 일은 sh-bang 줄을 다음과 같이 변경하여 bash가 실행되고 있는지 확인하는 것입니다.

#!/bin/bash

다음으로 작업 제어(a.k.a.)를 활성화해 보겠습니다."모니터 모드") 이전 질문의 간단한 솔루션 중 하나를 사용할 수 있습니다.

set -m

다음으로, 필요하지 않은 대부분의 하위 쉘 활동을 단순화하겠습니다. 이를 보여주기 위해 단순화된 명령을 사용합니다.

#wait 10 seconds before starting nav and rviz otherwise will get error
sleep 10 || exit
terminator -T "navigation ... bash" &
terminator -T "rviz ... bash" &
...
terminator -T "spawn_objects_launch" &

echo Press any key to to shutdown all processes
read varname
echo Shutting down...

모든 킬러 프로세스에 대해 전체 하위 쉘을 시작하고 이를 백그라운드에 배치할 필요는 없습니다. sleep 10서브쉘에서 실행할 필요는 없습니다 . 당신은하지 않습니다진짜sleep 10후속 명령을 연결하려면 반환 코드를 테스트해야 합니다 &&. 기존 동작과 일치하도록 코드를 조정했습니다. sleep 명령이 실패하면(예: Ctrl-C를 누름) 스크립트가 종료되고 실행되지 않습니다. 후속 종료가 시작됩니다.

마지막으로 하위 프로세스를 종료하는 코드를 추가합니다.

...
terminator -T "spawn_objects_launch" &

echo Press ENTER to shutdown all processes
read 
echo Shutting down...
kill $(jobs -p)

프롬프트를 다시 표현했습니다. 입력 내용을 보려면 (거의) 아무 키나 입력한 다음 Enter 키를 눌러야 하므로 read사용자가 Enter 키를 누르는 것이 좋습니다. 다음으로 read명령은 변수 이름을 허용하지만 직접 지정하지 않으면 name이라는 기본 변수를 사용하므로 REPLY이것이 더 분명한지 여부에 따라 코드를 단순화하는 또 다른 옵션입니다.

관련 정보