Ваша проблема в том, что usr
является унифицированным, и при первом проходе по циклу usr
не равен $1
, поэтому вы печатаете линию.
Можно добавить блок BEGIN
к коду awk:
BEGIN { usr = blank }
, а затем, внутри внутреннего if
, проверить это условие перед печатью:
...
{ if (usr != $1) {
if (usr != blank) { printf("%s\t%d\t%s\n",usr, num, tim); }
usr = $1;
num = 1 }
...
Не думайте об этом с точки зрения нажатия клавиш, подумайте об этом с точки зрения выполнения задачи. Нажатие клавиш - это способ сделать вещи интерактивно. Способ выполнения вещей автоматически - сценарию их.
Чтобы запустить работу на экране и немедленно отсоединить его, запустите
screen -md ./runMyJob.sh
Если вы хотите облегчить работу, вы можете пройти вариант -S
, чтобы установить имя сеанса.
Например, вы можете написать следующий скрипт, который использует имя исполняемого задания в качестве имени сеанса:
#!/bin/sh
screen -md -S "${1##*/}" "$@"
Вызовите его что-то вроде Отправить
, поставить его в каталог на вашем пути ( Однопользовательская бинарная установка? и и Как добавить путь к главному каталогу, который должен быть обнаружен с помощью Unix, какую команду? может помочь), сделайте его исполняемым ( chmod + x ~ / Bin / Отправить
). Чтобы начать работу, запустить
submit ./runMyJob.sh
для параллельного исполнения, вы можете расследовать GNU Parallel .
Обратите внимание, что рамочная структура заданий делает больше, чтобы начать работу. Он также организует для них, чтобы запустить, где есть доступное время и память ЦП, и отправлять журналы в отправители. Вы должны запросить, чтобы ваши администраторы устанавливали надлежащую структуру представления заданий.
введите , Ctrl - А и d d генерируют нормальные коды ASCII.
Таким образом, возможное решение может быть программой, которая создает неназванную трубу ( ()
), затем Fork ()
Детский процесс, который сначала связывает конечный конец трубы К своему стандартному входу, затем выполнение экрана
в дочернем процессе ( Execive ()
или аналогичный). Если эта программа запускается, вы можете написать командные строки, необходимые для начала процесса для записи запуска созданной трубы.
Как вы положили задания в эту программу, это еще одна тема. Вы могли бы, например, написать небольшой планировщик себя (что-то вроде очереди заданий и некоторый код, который начинается с большинства n процессов параллельно).
== Редактировать ==
для Linux (или, может быть, некоторые ООН * XES тоже), программа может выглядеть следующую:
#include <sys/types.h>
#include <sys/linux.h>
#include <unistd.h>
int main(void) {
int fds[2] = {0};
pid_t pid = 0;
pipe(fds); /* Creates an unnamed pipe */
pid = fork(); /* Forks a new process */
if (pid == 0) {
static char const *argv[] = {"/usr/bin/screen", NULL};
/* Note: The array might need to be changed,
* depending on your requirements
* (eg. command-line arguments)
*/
dup2(fds[0], stdin); /* Binds the read end of the pipe to stdin */
execve(argv[0], argv, NULL);
/* If you reach this point, your execve() failed */
}
sleep(1); /* Waits for the child process to execute
* screen */
char const data[] = "./MyJob.sh\n\x00d";
/* Note: You must replace the '\x00' by the
* ASCII code of C-a!
*/
write(fds[1], data, sizeof(data));
/* Writes the name of the job along with the
* control codes to the child process
*/
int retcode = 0;
waitpid(pid, &retcode, 0);
/* Waits for the child process to terminate */
/* Note: WEXITSTATUS(retcode) gets the exit
* status of the child process */
return 0;
}
Эта программа должна проиллюстрировать идею, ему не хватает необходимой обработки ошибок.