新しいターミネーター端末を作成し、各端末でプロセスを実行するバッチスクリプトを作成しようとしています。私はそれらを殺すことに決めるまでバックグラウンドで実行し続けたいと思います。
最初のプロセスが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
次に、ジョブ制御(aka)を有効にしてみましょう。「モニターモード」)前の質問の簡単な解決策の1つを使用することができます。
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
これがより明白であるかどうかに応じてコードを単純化する別のオプションです。