| # Tracing in Background |
| |
| This document describes how to run Perfetto in the background, allowing you to |
| disconnect from the device and collect the trace file later. |
| |
| ## Use Case |
| |
| Let's say you want to start recording a long-running trace on an Android device |
| or a Linux server, then terminate your adb/ssh shell and come back later to stop |
| the tracing session and collect the trace file. This page shows you how to do |
| this while ensuring the trace remains intact. |
| |
| To run tracing in the background, use the `--background-wait` argument with the |
| `perfetto` command. This will daemonize Perfetto (i.e., run it as a background |
| process) and print its process ID (PID). |
| |
| NOTE: It's recommended to use `--background-wait` rather than `--background`, as |
| the former waits for all data sources to be started before exiting. This ensures |
| that no data is lost at the beginning of the trace. |
| |
| ## Usage |
| |
| Start recording a trace using `tracebox` or `perfetto`. |
| |
| ```bash |
| perfetto -c config.cfg --txt -o trace.pftrace --background-wait |
| ``` |
| |
| This will print the pid of the background perfetto process to stdout. |
| |
| When you are ready to stop tracing, you need to send a `SIGINT` or `SIGTERM` |
| signal to the background Perfetto process. However, simply killing the process |
| creates a race condition: the `kill` command returns immediately, but Perfetto |
| may still be writing the final parts of the trace file to disk. |
| |
| If you collect the file too soon, it may be incomplete. To prevent this, you |
| must wait for the `close_write` event on the trace file, which confirms that |
| Perfetto has finished writing and closed the file. You can achieve this using |
| platform-specific `inotify` tools. |
| |
| <?tabs> |
| |
| TAB: Linux |
| |
| On Debian Linux we can use `inotifywait` from the `inotify-tools` package. |
| |
| ```bash |
| kill <pid> && inotifywait -e close_write trace.pftrace |
| ``` |
| |
| TAB: Android |
| |
| On Android we can use `inotifyd` from toybox. |
| |
| ```sh |
| kill <pid> && inotifyd - trace.pftrace:w | head -n0 |
| ``` |
| |
| </tabs?> |