summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--man/systemd-analyze.xml38
-rw-r--r--src/analyze/systemd-analyze.c52
2 files changed, 58 insertions, 32 deletions
diff --git a/man/systemd-analyze.xml b/man/systemd-analyze.xml
index c8d0b4743b..9f313d76f1 100644
--- a/man/systemd-analyze.xml
+++ b/man/systemd-analyze.xml
@@ -93,20 +93,21 @@
been started at what time, highlighting the time they
spent on initialization.</para>
- <para><command>systemd-analyze dot</command>
- Generate textual dependency graph description in dot
- format for further processing with the GraphViz
+ <para><command>systemd-analyze dot</command> Generate
+ textual dependency graph description in dot format for
+ further processing with the GraphViz
<citerefentry><refentrytitle>dot</refentrytitle><manvolnum>1</manvolnum></citerefentry>
tool. Use a command line like <command>systemd-analyze
- dot | dot -Tsvg > systemd.svg</command> to generate
- a graphical dependency tree. Unless
+ dot | dot -Tsvg > systemd.svg</command> to generate a
+ graphical dependency tree. Unless
<option>--order</option> or <option>--require</option>
is passed the generated graph will show both ordering
- and requirement dependencies.</para>
-
- <para>Optional patterns may be given at the end. The
- relationship is printed if any of these matches either
- lefthand or righthand node.</para>
+ and requirement dependencies. Optional pattern
+ globbing style specifications
+ (e.g. <filename>*.target</filename>) may be given at
+ the end. A unit dependency is included in the graph if
+ any of these patterns match either the origin or
+ destination node.</para>
<para>If no command is passed <command>systemd-analyze
time</command> is implied.</para>
@@ -192,6 +193,23 @@
</refsect1>
<refsect1>
+ <title>Examples</title>
+
+ <para>This plots all dependencies of any unit whose
+ name starts with "<literal>avahi-daemon.</literal>":</para>
+
+ <programlisting>$ systemd-analyze dot 'avahi-daemon.*' | dot -Tsvg > avahi.svg
+$ eog avahi.svg</programlisting>
+
+ <para>This plots the dependencies between all known target units:</para>
+
+ <programlisting>systemd-analyze dot --to-pattern='*.target' --from-patter='*.target' | dot -Tsvg > targets.svg
+$ eog targets.svg</programlisting>
+
+
+ </refsect1>
+
+ <refsect1>
<title>See Also</title>
<para>
<citerefentry><refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
diff --git a/src/analyze/systemd-analyze.c b/src/analyze/systemd-analyze.c
index ec579282e7..e648a4449f 100644
--- a/src/analyze/systemd-analyze.c
+++ b/src/analyze/systemd-analyze.c
@@ -626,40 +626,48 @@ static int graph_one_property(const char *name, const char *prop, DBusMessageIte
dbus_message_iter_next(&sub)) {
const char *s;
char **p;
- bool match_found = true;
+ bool match_found;
assert(dbus_message_iter_get_arg_type(&sub) == DBUS_TYPE_STRING);
dbus_message_iter_get_basic(&sub, &s);
- STRV_FOREACH(p, arg_dot_from_patterns) {
+ if (!strv_isempty(arg_dot_from_patterns)) {
match_found = false;
- if (fnmatch(*p, name, 0) == 0) {
- match_found = true;
- break;
- }
+
+ STRV_FOREACH(p, arg_dot_from_patterns)
+ if (fnmatch(*p, name, 0) == 0) {
+ match_found = true;
+ break;
+ }
+
+ if (!match_found)
+ continue;
}
- if (!match_found)
- continue;
- STRV_FOREACH(p, arg_dot_to_patterns) {
+ if (!strv_isempty(arg_dot_to_patterns)) {
match_found = false;
- if (fnmatch(*p, s, 0) == 0) {
- match_found = true;
- break;
- }
+
+ STRV_FOREACH(p, arg_dot_to_patterns)
+ if (fnmatch(*p, s, 0) == 0) {
+ match_found = true;
+ break;
+ }
+
+ if (!match_found)
+ continue;
}
- if (!match_found)
- continue;
- STRV_FOREACH(p, patterns) {
+ if (!strv_isempty(patterns)) {
match_found = false;
- if (fnmatch(*p, name, 0) == 0 || fnmatch(*p, s, 0) == 0) {
- match_found = true;
- break;
- }
+
+ STRV_FOREACH(p, patterns)
+ if (fnmatch(*p, name, 0) == 0 || fnmatch(*p, s, 0) == 0) {
+ match_found = true;
+ break;
+ }
+ if (!match_found)
+ continue;
}
- if (!match_found)
- continue;
printf("\t\"%s\"->\"%s\" %s;\n", name, s, c);
}