Skip to content

Commit 4581480

Browse files
authored
Update python nodes SIGINT handling (#539)
* Update python nodes sigint handling Signed-off-by: Ivan Santiago Paunovic <ivanpauno@ekumenlabs.com> * Handle sigterm and other exceptions correctly Signed-off-by: Ivan Santiago Paunovic <ivanpauno@ekumenlabs.com>
1 parent dba4daa commit 4581480

File tree

8 files changed

+64
-24
lines changed

8 files changed

+64
-24
lines changed

demo_nodes_py/demo_nodes_py/services/add_two_ints_server.py

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,12 @@
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
1414

15+
import sys
16+
1517
from example_interfaces.srv import AddTwoInts
1618

1719
import rclpy
20+
from rclpy.executors import ExternalShutdownException
1821
from rclpy.node import Node
1922

2023

@@ -40,11 +43,13 @@ def main(args=None):
4043
rclpy.spin(node)
4144
except KeyboardInterrupt:
4245
pass
43-
44-
# Destroy the node explicitly
45-
# (optional - Done automatically when node is garbage collected)
46-
node.destroy_node()
47-
rclpy.shutdown()
46+
except ExternalShutdownException:
47+
sys.exit(1)
48+
finally:
49+
# Destroy the node explicitly
50+
# (optional - Done automatically when node is garbage collected)
51+
rclpy.try_shutdown()
52+
node.destroy_node()
4853

4954

5055
if __name__ == '__main__':

demo_nodes_py/demo_nodes_py/topics/listener.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,10 @@
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
1414

15+
import sys
16+
1517
import rclpy
18+
from rclpy.executor import ExternalShutdownException
1619
from rclpy.node import Node
1720

1821
from std_msgs.msg import String
@@ -36,9 +39,11 @@ def main(args=None):
3639
rclpy.spin(node)
3740
except KeyboardInterrupt:
3841
pass
39-
40-
node.destroy_node()
41-
rclpy.shutdown()
42+
except ExternalShutdownException:
43+
sys.exit(1)
44+
finally:
45+
node.destroy_node()
46+
rclpy.try_shutdown()
4247

4348

4449
if __name__ == '__main__':

demo_nodes_py/demo_nodes_py/topics/talker.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,10 @@
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
1414

15+
import sys
16+
1517
import rclpy
18+
from rclpy.executors import ExternalShutdownException
1619
from rclpy.node import Node
1720

1821
from std_msgs.msg import String
@@ -44,9 +47,11 @@ def main(args=None):
4447
rclpy.spin(node)
4548
except KeyboardInterrupt:
4649
pass
47-
48-
node.destroy_node()
49-
rclpy.shutdown()
50+
except ExternalShutdownException:
51+
sys.exit(1)
52+
finally:
53+
rclpy.try_shutdown()
54+
node.destroy_node()
5055

5156

5257
if __name__ == '__main__':

quality_of_service_demo/rclpy/quality_of_service_demo_py/deadline.py

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,14 @@
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
1414
import argparse
15+
import sys
1516

1617
from quality_of_service_demo_py.common_nodes import Listener
1718
from quality_of_service_demo_py.common_nodes import Talker
1819

1920
import rclpy
2021
from rclpy.duration import Duration
22+
from rclpy.executors import ExternalShutdownException
2123
from rclpy.executors import SingleThreadedExecutor
2224
from rclpy.logging import get_logger
2325
from rclpy.qos import QoSProfile
@@ -68,9 +70,14 @@ def main(args=None):
6870
executor = SingleThreadedExecutor()
6971
executor.add_node(listener)
7072
executor.add_node(talker)
71-
executor.spin()
72-
73-
rclpy.shutdown()
73+
try:
74+
executor.spin()
75+
except KeyboardInterrupt:
76+
pass
77+
except ExternalShutdownException:
78+
sys.exit(1)
79+
finally:
80+
rclpy.try_shutdown()
7481

7582

7683
if __name__ == '__main__':

quality_of_service_demo/rclpy/quality_of_service_demo_py/incompatible_qos.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020

2121
import rclpy
2222
from rclpy.duration import Duration
23+
from rclpy.executors import ExternalShutdownException
2324
from rclpy.executors import SingleThreadedExecutor
2425
from rclpy.logging import get_logger
2526
from rclpy.qos import QoSDurabilityPolicy
@@ -131,7 +132,7 @@ def main(args=None):
131132
print()
132133
print(exc, end='\n\n')
133134
print('Please try this demo using a different RMW implementation')
134-
return -1
135+
return 1
135136

136137
executor = SingleThreadedExecutor()
137138
executor.add_node(listener)
@@ -142,8 +143,10 @@ def main(args=None):
142143
executor.spin_once()
143144
except KeyboardInterrupt:
144145
pass
145-
146-
rclpy.shutdown()
146+
except ExternalShutdownException:
147+
return 1
148+
finally:
149+
rclpy.try_shutdown()
147150

148151
return 0
149152

quality_of_service_demo/rclpy/quality_of_service_demo_py/message_lost_listener.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,10 @@
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
1414

15+
import sys
16+
1517
import rclpy
18+
from rclpy.executors import ExternalShutdownException
1619
from rclpy.executors import SingleThreadedExecutor
1720
from rclpy.node import Node
1821
from rclpy.qos_event import SubscriptionEventCallbacks
@@ -68,8 +71,10 @@ def main():
6871
executor.spin()
6972
except KeyboardInterrupt:
7073
pass
74+
except ExternalShutdownException:
75+
sys.exit(1)
7176
finally:
72-
rclpy.shutdown()
77+
rclpy.try_shutdown()
7378

7479

7580
if __name__ == '__main__':

quality_of_service_demo/rclpy/quality_of_service_demo_py/qos_overrides_listener.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,10 @@
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
1414

15+
import sys
16+
1517
import rclpy
18+
from rclpy.executors import ExternalShutdownException
1619
from rclpy.node import Node
1720
from rclpy.qos_overriding_options import QosCallbackResult
1821
from rclpy.qos_overriding_options import QoSOverridingOptions
@@ -52,9 +55,11 @@ def main(args=None):
5255
rclpy.spin(node)
5356
except KeyboardInterrupt:
5457
pass
55-
56-
node.destroy_node()
57-
rclpy.shutdown()
58+
except ExternalShutdownException:
59+
sys.exit(1)
60+
finally:
61+
rclpy.try_shutdown()
62+
node.destroy_node()
5863

5964

6065
if __name__ == '__main__':

quality_of_service_demo/rclpy/quality_of_service_demo_py/qos_overrides_talker.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,10 @@
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
1414

15+
import sys
16+
1517
import rclpy
18+
from rclpy.executors import ExternalShutdownException
1619
from rclpy.node import Node
1720
from rclpy.qos_overriding_options import QosCallbackResult
1821
from rclpy.qos_overriding_options import QoSOverridingOptions
@@ -60,9 +63,11 @@ def main(args=None):
6063
rclpy.spin(node)
6164
except KeyboardInterrupt:
6265
pass
63-
64-
node.destroy_node()
65-
rclpy.shutdown()
66+
except ExternalShutdownException:
67+
sys.exit(1)
68+
finally:
69+
rclpy.try_shutdown()
70+
node.destroy_node()
6671

6772

6873
if __name__ == '__main__':

0 commit comments

Comments
 (0)