Як зробити / bin / ps, викликаний aux як його аргументом, записати у файл?


2

Чи є аргумент командного рядка, який я можу передати, щоб /bin/ps -auxвін змусив записати свій вихід у файл?


редагувати: щоб змінити проблему:

  1. Відкрити Firefox
  2. Увімкнути налаштування розробника (або як ярлик встановити додаток DevPrefs )
  3. Відкрийте Scratchpad, натиснувши Shift + F4
  4. У рядку меню перейдіть до меню «Браузер» та натисніть «Навколишнє середовище»
  5. Тепер в коді скретчпад вставте цей код, цей код знайде 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);
    
  6. Потім натисніть 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 + ''];

2
Розмова про проблему XY ! Перенаправлення не є аргументом для команди. Спробуйте переспрямувати STDOUT з JavaScript. (Я не торкався JS у віках, дозвольте шукати кращий спосіб.)
muru

Відповіді:


3

З мінімальним дотиком до JavaScript (з мого боку), я б запропонував це:

Запуск bashзамість ps- зробити все пошуки і перевіряє bashі ps, і почати процес bashз аргументами: -c, ps.path + ' aux > '+ filePathToOutputTo.

Загальна команда тут повинна виглядати так:

/bin/bash -c "/bin/ps aux > /path/to/output/file"

Дуже дякую, сер, іду перевірити це і
звітуйте

2
О, боже, це спрацювало !!! Дякую!!!!!! Мені насправді довелося пропустити це без подвійних лапок. Подвійні котирування заважають йому працювати. :(
Noitidart

@Noitidart ах, так. Подвійні лапки повинні зробити це єдиним аргументом, але це було б не потрібно, оскільки бібліотека JavaScript так чи інакше робить.
муру

3

Переглядаючи список параметрів командного рядка , прийнятих psв на psсторінці керівництва (доступні там і працює man ps) , показує його не має опцію для входу в файл. Багато команд цього не роблять. Але ти все одно можеш змусити його робити те, що ти хочеш.

Перенаправлення на >або >>, як пояснює John1024, посилає стандартний висновок вашої програми у файл або пристрій, названий праворуч від >/ >>. Це звучить так, що ви хочете.

Однак якщо ви хочете записати вихід у файл, а також побачити його самостійно в терміналі, тоді ви можете скористатися teeутилітою.

ps aux | tee file

Це використання ( ) подобається , але воно також показує вихід. Якщо ви хочете побачити вихід і додати його до файлу (а не перезаписувати), використовуйте прапор:| tee file> file-a

ps aux | tee -a file

Це використання ( ) відповідає .| tee -a file>> file

Як teeпрацює?

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

Зазвичай - тобто коли програма або команда запускається найпростішим способом - її стандартний вхід отримується від користувача. Це те, що користувач вводить під час роботи програми.

Але труба оператор з'єднує стандартний висновок команди зліва від нього, на стандартне введення команди праворуч від нього. У наведених вище прикладах це призводить до надсилання свого виводу на вхід замість терміналу (і отримання його вводу з виходу , а не з терміналу).|ps auxteeteeps aux

teeпотім пише те, що отримано fileі до терміналу, і до нього.

До речі, одне поширене використання труб - це коли ви передбачаєте, що вихід команди буде довгим, і ви хочете мати можливість переміщатися вгору та вниз. Потім ви можете передати його вихід less. Наприклад: dmesg | less.

Вихідні помилки перенаправлення / консолі

Рішення для перенаправлення та трубопроводу, обговорені вище, та у відповіді John1024 змінюються там, де йде стандартний вихід, але вони залишають стандартну помилку в спокої. Тобто більшість повідомлень про помилки (а також деякі інші повідомлення, залежно від програми) не впливають - навіть у , помилки з’являться на екрані, а не у файлі.ps aux > file

Зазвичай це те, що ти хочеш. І особливо у випадку ps aux, навряд чи ви хочете, щоб повідомлення про помилки у вихідному файлі були помилки - помилки несподівані, і ви, ймовірно, хочете їх побачити відразу. Помилка, швидше за все, зробить файл, який ви намагаєтесь зробити непридатним для своєї задачі, припускаючи, що ваша мета - створити таблицю запущених процесів та їх характеристик.

Однак, якщо ви робите хочете висновок помилок слід розглядати так само , як звичайний вихід, ви можете використовувати &-suffixed версію перепрофілювання і трубопроводи операторів:

bash, інтерактивна оболонка за замовчуванням в Ubuntu, підтримує &оператори ed. Це оболонка, яку ви використовуєте, якщо ви навмисно не перейшли на інший, тож для інтерактивного використання (і для сценаріїв, де ви знаєте, що вони будуть запускатися bash), ви безперечно можете нею користуватися.

Виводиться помилка перенаправлення / конфігурації на оболонках, у яких немає &операторів ed.

Деякі оболонки (як dash, наприклад , що надає shUbuntu ) не підтримують їх. У такому випадку ви отримаєте помилки, як-от:

  • dash: 2: Syntax error: Bad fd number(при спробі використання >&- навпаки, &>і &>>, якщо не підтримується, інтерпретують як & >і & >>, що роблять щось інше )
  • dash: 1: Syntax error: "&" unexpected(при спробі використання |&)

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

Це досягається за допомогою2>&1 . ( 1це дескриптор файлу для стандартного виводу та 2дескриптор файлу для стандартної помилки.)

Для перенаправлення (тобто, коли ви хочете використовувати >&або >>&), поставте 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

Така супер відповідь дякую! Я протестую це і звіту про це пізніше сьогодні :)
Noitidart

Перенаправлення працює чудово від терміналу, ps aux >/home/noi/Desktop/me.txtале чи можна це >/home/noi/Desktop/me.txtпередавати як аргумент командного рядка? Коли я це роблю, його не завантажують у файл :(
Noitidart

1
@Noitidart Що ти намагаєшся робити саме? Як передано як аргумент командного рядка до чого ? (І яка мета?) Я розумію, що ви сказали, - це те, що ps aux >/home/noi/Desktop/me.txtпрацює, і файл me.txtна вашому робочому столі заповнюється результатом ps aux. Якщо це так, то що "не завантажується у файл"? (Якщо це не так, то я не розумію, що ви маєте на увазі під "перенаправлення працює приголомшливо".) Що працює, а що ні, точно? Розкажіть, будь ласка, про всі запущені команди, що ви сподіваєтесь чи очікуєте та що натомість відбувається.
Елія Каган

Щира подяка за ваш час та намагаючись мені так допомогти, я дуже ціную це. Я додав код у публікації вище. Він використовує nsiProcess для запуску ps.
Noitidart

1
Вирішивши це, Джон зазначив, що він вважає, що він обходить оболонку, тому Муру сказав використовувати bash і pass як string і це спрацювало. Супер супер щире дякую за цей пост, я використав стільки інформації з нього у своїх 9 годин тестування! Я розповім своїм друзям про цю публікацію, щоб вони побачили, наскільки вона корисна, і ви проголосуєте за вас :)
Noitidart

2

Програми Unix, як правило, записують свої результати на "стандартний вихід", також відомий як stdout. Використовуючи функцію перенаправлення оболонки, stdout може бути відправлений у файл замість терміналу. Щоб надіслати його до імені файлу file, використовуйте:

ps aux >file

Символ >вказує на переспрямування, а за ним має бути ім'я файлу. Якщо файл вже існує, він буде перезаписаний. Якщо ви хочете замість цього додати файл до наявного файлу, використовуйте символ >>як у:

ps aux >>file

До речі, дуже поширене використання для перенаправлення - замовчування багатослівної команди. Для цього можна перенаправити свій вихід у файл /dev/null. Це спеціальний файл, який викидає будь-який вхід, який ви надсилаєте до нього.

Робота зі сценаріями

Перенаправлення можна використовувати в сценарії:

#!/bin/sh
ps aux >file

Крім того, перенаправлення можна застосувати до виводу сценарію в цілому:

myscript >file

Ви також можете передати ім'я файлу як аргумент. Припустимо, що myscriptскладається з:

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

( $1є script-ese для першого аргументу в командному рядку.) Тоді ви можете запустити:

myscript somefile

і ps auxкоманду буде переспрямовано на somefile.


Дуже приємна проста відповідь для мене, що я дуже дякую вам !! :) Я пройду тест сьогодні ввечері і звіту: :)
Noitidart

Перенаправлення працює чудово від терміналу, ps aux >/home/noi/Desktop/me.txtале чи можна це >/home/noi/Desktop/me.txtпередавати як аргумент командного рядка? Коли я це роблю, його не завантажують у файл :(
Noitidart

1
@Noitidart Він буде працювати при використанні в сценарії. Однак передати його як "аргумент командного рядка" сценарію було б складно. Щоб уточнити свої цілі, будь ласка, додайте сценарій до свого питання.
John1024,

1
@Noitidart Я оновив відповідь деякими реченнями на скриптах.
John1024

1
@Noitidart Дякую за пояснення. Мені здається, що runAsyncцілком обходить оболонку. У цьому випадку відсутні всі функції оболонки, такі як перенаправлення. Я пропоную окреме запитання, шукаючи відповіді експертів javascript / runAsync.
John1024
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.