Как сделать / bin / ps, вызванный с помощью aux в качестве аргумента, записать в файл?

Есть ли аргумент командной строки, который я могу передать в /bin/ps -aux, чтобы заставить его записывать свой вывод в файл?

edit: Чтобы сгладить мою проблему: [!d2 ] Открыть firefox Включить настройки разработчика (или как добавить ярлык addon DevPrefs) Открыть Scratchpad нажатием Shift + F4 В строке меню перейти в меню «Браузер» и нажать «Среда» Теперь в код блокнота вставить этот код, этот код будет найдите ps, а затем запустите его с параметрами командной строки aux и >PATH_TO_DESKTOP_me.txt

var thisWin = Services.ww.activeWindow;
var env = Cc['@mozilla.org/process/environment;1'].getService(Ci.nsIEnvironment);

var psCommand = 'ps';
var paths = env.get('PATH').split(':');
var len = paths.length;
for (var i = 0; i < len; i++) {
    try {
        var fullyQualified = new FileUtils.File(OS.Path.join(paths[i], psCommand));
        console.log('fullyQualified:', fullyQualified.path)
        if (fullyQualified.exists()) {
            var ps = fullyQualified;
            break;
        }
    } catch (e) {
        // keep checking PATH if we run into NS_ERROR_FILE_UNRECOGNIZED_PATH
    }
}

if (!ps) {
    console.error("Error: a task list executable not found on filesystem");
    thisWin.alert('Error: a task list executable not found on filesystem');
  throw new Error("Error: a task list executable not found on filesystem");
}

thisWin.alert('path to ps: "' + ps.path + '"');

var process = Cc['@mozilla.org/process/util;1'].createInstance(Ci.nsIProcess);
process.init(ps);

var procFinned = {
    observe: function (aSubject, aTopic, aData) {
            thisWin.alert('ps completed');
    }
};

var filePathToOutputTo = OS.Path.join(OS.Constants.Path.desktopDir, 'me.txt');
thisWin.alert('will write to file path: "' + filePathToOutputTo + '"');
var args = ['aux', '>' + filePathToOutputTo];
var a = process.runAsync(args, args.length, procFinned);
. Затем нажмите Ctrl + R, чтобы запустить код, или можете сделать то же самое, выбрав «Выполнить» и нажав «Запустить».

Итак, код запускает ps-процесс с здесь:

var args = ['aux', '>' + filePathToOutputTo];
var a = process.runAsync(args, args.length, procFinned);
Комбинации пробовали: с кавычками: var args = ['aux', '>"' + filePathToOutputTo + '"']; как одно значение записи в массиве с кавычками var args = ['aux >"' + filePathToOutputTo + '"']; как одна запись массива без кавычек: var args = ['aux >' + filePathToOutputTo + ''];
1
задан 28 February 2015 в 05:37

2 ответа

Просматривая список опций командной строки, принятых ps на странице руководства ps (доступный там и при запуске man ps), показывает, что у него нет возможности для входа в файл. Многие команды этого не делают.

Перенаправление с помощью > или >>, как объясняет John1024, отправляет стандартный вывод вашей программы в файл или устройство по имени справа от > / [F13]. Похоже, это то, что вы хотите.

Однако, если вы хотите записать вывод в файл, а также увидеть его непосредственно в терминале, то вы можете использовать в ps manual [] d1].

ps aux | tee file

Это использование (| tee file) похоже на > file, но оно также показывает вам выход. Если вы хотите увидеть вывод и также увидеть его непосредственно в файл (а не переписывать), используйте флаг -a:

ps aux | tee -a file

Это использование ([ f18]) соответствует >> file.

Как работает tee?

tee дублирует свой стандартный ввод, записывая его как в файл (или список файлов) заданный в качестве аргументов командной строки и стандартный вывод.

Обычно - то есть, когда программа или команда запускаются самым простым способом - его стандартный ввод принимается от пользователя. Это то, что пользователь вводит при запуске программы.

Но стандартный вход подключает стандартный вывод команды слева от него, к стандартным вводам команды в право на это. В приведенных выше примерах это приводит к тому, что ps aux отправляет свой вывод на вход tee вместо терминала (и tee, чтобы получить свой вход с выхода ps aux, а не от терминала).

tee затем записывает, что он получен как file, так и к терминалу.

Кстати, одно общее использование труб - это когда вы ожидаете вывод команды будет длинным, и вы хотите, чтобы иметь возможность перемещаться вверх и вниз в нем. Затем вы можете передать свой вывод на less. Например: dmesg | less.

Выход ошибки перенаправления / трубопровода.

Решения для перенаправления и трубопроводов, рассмотренные выше, и в ответе John1024, где стандартный выход идет, но они оставляют [d15 ] стандартный выпуск один. То есть большинство сообщений об ошибках (и некоторых других сообщений в зависимости от программы) не затронуты - даже в ps aux > file на экране появятся ошибки и file . [!d26 ]

Это обычно то, что вы хотите. И особенно в случае ps aux, маловероятно, что вы хотите получать сообщения об ошибках в своем выходном файле - ошибки являются неожиданными, и вы, вероятно, захотите их сразу увидеть. В любом случае ошибка приведет к тому, что файл, который вы пытаетесь сделать непригодным для своей задачи, в любом случае, если вы хотите создать таблицу запущенных процессов и их характеристики.

Однако, если вы хотите получить вывод ошибки чтобы быть обработанным точно так же, как и обычный выход, вы можете использовать & -сусовую версию операторов перенаправления и трубопроводов:

>& (или &>) вместо >: ps aux >& file или ps aux &> file &>> (не >>&) вместо >>: ps aux &>> file. |& (не &|) вместо |: ps aux |& tee file или ps aux |& tee -a file to append.

bash, интерактивная оболочка по умолчанию в Ubuntu, поддерживает операторы & ed. Это оболочка, которую вы используете, если вы не намеренно переключились на другую, поэтому для интерактивного использования (и для скриптов, где вы знаете, что они будут запущены с bash), вы определенно можете свободно их использовать. [ ! d42]

Вывод ошибки перенаправления / трубопровода на оболочках, которые не имеют операторов &.

Некоторые оболочки (например, dash, которые ответ John1024 ) не поддерживают их. В этом случае вместо > вы получите следующие ошибки:

>& (или &>): ps aux >& file или ps aux &> file dash: 1: Syntax error: "&" unexpected (при попытке использовать |&)

При работе в оболочке, где >&, >>& и |& не поддерживаются, вы можете отправить как стандартный вывод, так и стандартную ошибку через перенаправление или трубы традиционным способом, указав отдельно, что стандартная ошибка сначала перенаправляется на стандартный вывод.

Это достигается с помощью 2>&1. (1 является файловым дескриптором для стандартного вывода, а 2 является файловым дескриптором стандартной ошибки.)

Для do (т. е. когда вы хотите чтобы использовать >& или >>&), поставьте 2>&1 в самом конце:

ps aux > file 2>&1
ps aux >> file 2>&1

Для трубы (т. е. когда вы хотите быть в состоянии для использования |&), поставьте 2>&1 прямо перед трубой |:

ps aux 2>&1 | tee file
ps aux 2>&1 | tee -a file
3
ответ дан 24 May 2018 в 03:47
  • 1
    Такой супер ответ спасибо! Я проверю его и отчитаюсь позже сегодня :) – Noitidart 11 September 2014 в 20:18
  • 2
    Перенаправление работает потрясающе с терминала ps aux >/home/noi/Desktop/me.txt, но может ли этот >/home/noi/Desktop/me.txt передаваться как аргумент командной строки? Когда я делаю это, он не демпинг в файл :( – Noitidart 11 September 2014 в 23:12
  • 3
    @Noitidart Что вы пытаетесь сделать точно? Передано в качестве аргумента командной строки для , что ? (И в чем цель?) Мое понимание того, что вы сказали, заключается в том, что ps aux >/home/noi/Desktop/me.txt работает, а файл me.txt на вашем рабочем столе заполняется выводом ps aux. Если это так, то что «не демпинг в файл»? (Если это не случай, тогда я не понимаю, что вы подразумеваете под «« Перенаправление работает потрясающе ».) Что работает, а что нет, точно? Расскажите о полных командах, которыми вы работаете, о том, чего вы надеетесь или ожидаете, и что происходит вместо этого. – Eliah Kagan 12 September 2014 в 00:18
  • 4
    Искренняя благодарность за ваше время и попытка помочь мне так много, я очень ценю это. Я добавил код в сообщение выше. Он использует nsi Process для запуска ps. – Noitidart 12 September 2014 в 01:55
  • 5
    Решив это, Джон сказал, что он думает, что он обходит оболочку, поэтому муру сказал, чтобы использовать bash и передать как строку, и это сработало. Супер супер искреннее спасибо за этот пост, я использовал так много информации из него за 9 часов тестирования! Я расскажу своим друзьям об этом сообщении, чтобы они могли видеть, насколько он полезен, и проголосуйте за вас :) – Noitidart 12 September 2014 в 11:53

Программы Unix обычно записывают свой вывод в «стандартное», также известное как stdout. Используя функцию shell для перенаправления, stdout может быть отправлен в файл вместо терминала. Чтобы отправить его в имя файла file, используйте:

ps aux >file

Символ > указывает на перенаправление и за ним следует имя файла. Если файл уже существует, он будет перезаписан. Если вы хотите добавить к существующему файлу вместо этого, используйте символ >>, как в:

ps aux >>file

. Кстати, очень частое использование для перенаправления заключается в том, чтобы отключить команду verbose. Для этого можно перенаправить свой вывод в файл /dev/null. Это специальный файл, который отбрасывает все входящие в него данные.

Работа со скриптами

Перенаправление может использоваться в скрипте:

#!/bin/sh
ps aux >file
[d5 ] Альтернативно, перенаправление может быть применено к выходу скрипта в целом:

myscript >file

Вы также можете передать имя файла в качестве аргумента. Предположим, что myscript состоит из:

#!/bin/sh
ps aux >"$1"

($1 является скриптом для первого аргумента в командной строке.) Затем вы можете запустить:

myscript somefile

, а команда ps aux будет перенаправлена ​​на somefile.

2
ответ дан 24 May 2018 в 03:47
  • 1
    Очень хороший простой ответ для меня, чтобы я поблагодарил вас! :) Жестокий тест сегодня вечером и отчитайся :) – Noitidart 11 September 2014 в 20:18
  • 2
    Перенаправление работает потрясающе с терминала ps aux >/home/noi/Desktop/me.txt, но может ли этот >/home/noi/Desktop/me.txt передаваться как аргумент командной строки? Когда я делаю это, он не демпинг в файл :( – Noitidart 11 September 2014 в 23:12
  • 3
    @Noitidart Это будет работать при использовании в скрипте. Однако вы передаете его как аргумент командной строки " сценарию было бы сложно. Чтобы прояснить ваши цели, добавьте сценарий к своему вопросу. – John1024 11 September 2014 в 23:19
  • 4
    @Noitidart Я обновил ответ с некоторыми предложениями по скриптам. – John1024 12 September 2014 в 00:47
  • 5
    @Noitidart Спасибо за разъяснение. Мне кажется, что runAsync полностью обходит оболочку. В этом случае все функции оболочки, такие как перенаправление, отсутствуют. Я предлагаю отдельный вопрос для поиска ответов экспертов javascript / runAsync. – John1024 12 September 2014 в 02:33

Другие вопросы по тегам:

Похожие вопросы: