cgls.c revision 3f6fd1ba65f962702753c4ad284b588e59689a23
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen This file is part of systemd.
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen Copyright 2010 Lennart Poettering
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen systemd is free software; you can redistribute it and/or modify it
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen under the terms of the GNU Lesser General Public License as published by
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen the Free Software Foundation; either version 2.1 of the License, or
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen (at your option) any later version.
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen systemd is distributed in the hope that it will be useful, but
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen WITHOUT ANY WARRANTY; without even the implied warranty of
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen Lesser General Public License for more details.
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen You should have received a copy of the GNU Lesser General Public License
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen along with systemd; If not, see <http://www.gnu.org/licenses/>.
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersenstatic bool arg_no_pager = false;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersenstatic bool arg_kernel_threads = false;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersenstatic bool arg_all = false;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersenstatic char* arg_machine = NULL;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersenstatic void help(void) {
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen printf("%s [OPTIONS...] [CGROUP...]\n\n"
d5d8429a12c4b1ef0dcd226c0904f00f4fa4898aLennart Poettering "Recursively show control group contents.\n\n"
d5d8429a12c4b1ef0dcd226c0904f00f4fa4898aLennart Poettering " -h --help Show this help\n"
d5d8429a12c4b1ef0dcd226c0904f00f4fa4898aLennart Poettering " --version Show package version\n"
d5d8429a12c4b1ef0dcd226c0904f00f4fa4898aLennart Poettering " --no-pager Do not pipe output into a pager\n"
d5d8429a12c4b1ef0dcd226c0904f00f4fa4898aLennart Poettering " -a --all Show all groups, including empty\n"
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen " -l --full Do not ellipsize output\n"
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen " -k Include kernel threads in output\n"
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen " -M --machine= Show container\n"
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen , program_invocation_short_name);
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersenstatic int parse_argv(int argc, char *argv[]) {
8fba1c8d4e3d05d2af2848b6570bdc09e725d06eZbigniew Jędrzejewski-Szmek static const struct option options[] = {
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen { "help", no_argument, NULL, 'h' },
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen { "version", no_argument, NULL, ARG_VERSION },
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen { "no-pager", no_argument, NULL, ARG_NO_PAGER },
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen { "all", no_argument, NULL, 'a' },
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen { "full", no_argument, NULL, 'l' },
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen { "machine", required_argument, NULL, 'M' },
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen while ((c = getopt_long(argc, argv, "hkalM:", options, NULL)) >= 0)
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen assert_not_reached("Unhandled option");
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersenstatic int get_cgroup_root(char **ret) {
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen _cleanup_bus_flush_close_unref_ sd_bus *bus = NULL;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen _cleanup_free_ char *unit = NULL, *path = NULL;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen return log_error_errno(r, "Failed to get root control group path: %m");
b7e7184634d573fb73143210962acce205f37f61Michael Biebl m = strjoina("/run/systemd/machines/", arg_machine);
b7e7184634d573fb73143210962acce205f37f61Michael Biebl r = parse_env_file(m, NEWLINE, "SCOPE", &unit, NULL);
b7e7184634d573fb73143210962acce205f37f61Michael Biebl return log_error_errno(r, "Failed to load machine data: %m");
b7e7184634d573fb73143210962acce205f37f61Michael Biebl r = bus_open_transport(BUS_TRANSPORT_LOCAL, NULL, false, &bus);
b7e7184634d573fb73143210962acce205f37f61Michael Biebl return log_error_errno(r, "Failed to create bus connection: %m");
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen unit_dbus_interface_from_name(unit),
8fba1c8d4e3d05d2af2848b6570bdc09e725d06eZbigniew Jędrzejewski-Szmek return log_error_errno(r, "Failed to query unit control group path: %s", bus_error_message(&error, r));
260ad50f5b4a9795032e3119c64f838a2d03370dThomas Hindoe Paaboel Andersenstatic void show_cg_info(const char *controller, const char *path) {
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen printf("Controller %s; ", controller);
8fba1c8d4e3d05d2af2848b6570bdc09e725d06eZbigniew Jędrzejewski-Szmek printf("Control group %s:\n", isempty(path) ? "/" : path);
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen (arg_full > 0) * OUTPUT_FULL_WIDTH;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen _cleanup_free_ char *root = NULL;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen for (i = optind; i < argc; i++) {
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen if (path_startswith(argv[i], "/sys/fs/cgroup")) {
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen printf("Directory %s:\n", argv[i]);
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen q = show_cgroup_by_path(argv[i], NULL, 0, arg_kernel_threads, output_flags);
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen _cleanup_free_ char *c = NULL, *p = NULL, *j = NULL;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen const char *controller, *path;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen r = cg_split_spec(argv[i], &c, &p);
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen log_error_errno(r, "Failed to split argument %s: %m", argv[i]);
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen controller = c ?: SYSTEMD_CGROUP_CONTROLLER;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen j = strjoin(root, "/", p, NULL);
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen show_cg_info(controller, path);
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen q = show_cgroup(controller, path, NULL, 0, arg_kernel_threads, output_flags);
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen _cleanup_free_ char *cwd = NULL;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen cwd = get_current_dir_name();
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen r = log_error_errno(errno, "Cannot determine current working directory: %m");
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen if (path_startswith(cwd, "/sys/fs/cgroup")) {
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen printf("Working directory %s:\n", cwd);
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen r = show_cgroup_by_path(cwd, NULL, 0, arg_kernel_threads, output_flags);
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen _cleanup_free_ char *root = NULL;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen show_cg_info(SYSTEMD_CGROUP_CONTROLLER, root);
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen r = show_cgroup(SYSTEMD_CGROUP_CONTROLLER, root, NULL, 0, arg_kernel_threads, output_flags);
4e4885553447f6f4c014bfa3e5b5837a76a0e612Lennart Poettering log_error_errno(r, "Failed to list cgroup tree: %m");