Есть ли аргумент командной строки, который я могу передать в /bin/ps -aux, чтобы заставить его записывать свой вывод в файл?
edit: Чтобы сгладить мою проблему: [!d2 ] Открыть firefox Включить настройки разработчика (или как добавить ярлык addon DevPrefs) Открыть Scratchpad нажатием Shift + F4 В строке меню перейти в меню «Браузер» и нажать «Среда» Теперь в код блокнота вставить этот код, этот код будет найдите ps, а затем запустите его с параметрами командной строки aux и >PATH_TO_DESKTOP_me.txt
. Затем нажмите Ctrl + R, чтобы запустить код, или можете сделать то же самое, выбрав «Выполнить» и нажав «Запустить». 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);
Итак, код запускает 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 + '']; Просматривая список опций командной строки, принятых 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 дублирует свой стандартный ввод, записывая его как в файл (или список файлов) заданный в качестве аргументов командной строки и стандартный вывод.
Обычно - то есть, когда программа или команда запускаются самым простым способом - его стандартный ввод принимается от пользователя. Это то, что пользователь вводит при запуске программы.
Но стандартный вход подключает стандартный вывод команды слева от него, к стандартным вводам команды в право на это. В приведенных выше примерах это приводит к тому, что 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
Программы 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.