Избегать любых сообщений завершения задания (на командной строке, а также в ps
вывод), можно поместить команду, чтобы быть фоном в a sh -c 'cmd &'
создать.
{
ps
echo
pid="$(sh -c 'sleep 60 1>&- & echo ${!}')"
#pid="$(sh -c 'sleep 60 1>/dev/null & echo ${!}')"
#pid="$(sh -c 'sleep 60 & echo ${!}' | head -1)"
ps
kill $pid
echo
ps
}
Между прочим, возможно вложить непосредственные уведомления о завершении задания bash
при помощи опций оболочки set -b
или set -o notify
соответственно.
В этом случае"bash
получает a SIGCHLD
сигнал и его обработчик сигналов сразу отображают уведомление - даже если bash
в настоящее время посреди ожидания приоритетного процесса для завершения" (см. следующую ссылку ниже).
Получить третий режим промежутка уведомления об управлении заданиями set +b
(режим по умолчанию) и set -b
(так, чтобы Вы получили непосредственные уведомления о завершении задания, не повреждая то, чему Вы уже ввели на своей текущей командной строке - подобный ctrl-x ctrl-v
) требует патча к bash
Simon Tatham (для самого патча и дополнительной информации см.: Разумное асинхронное уведомление о задании в ударе (1)).
Поэтому просто давайте повторимся Matteo Italia
gdb
- fu для a bash
оболочка, которая была установлена сразу уведомить относительно завершения задания с set -b
.
# 2 Terminal.app windows
# terminal window 1
# start Bash compiled with -g flag
~/Downloads/bash-4.2/bash -il
set -bm
echo $$ > bash.pid
# terminal window 2
gdb -n -q
(gdb) set print pretty on
(gdb) set history save on
(gdb) set history filename ~/.gdb_history
(gdb) set step-mode off
(gdb) set verbose on
(gdb) set height 0
(gdb) set width 0
(gdb) set pagination off
(gdb) set follow-fork-mode child
(gdb) thread apply all bt full
(gdb) shell cat bash.pid
(gdb) attach
(gdb) break pretty_print_job
# terminal window 1
# cut & paste
# (input will be invisible on the command line)
sleep 600 &
# terminal window 2
(gdb) continue
(gdb) ctrl-c
# terminal window 1
# cut & paste
kill $!
# terminal window 2
(gdb) continue
(gdb) bt
Reading in symbols for input.c...done.
Reading in symbols for readline.c...done.
Reading in symbols for y.tab.c...done.
Reading in symbols for eval.c...done.
Reading in symbols for shell.c...done.
#0 pretty_print_job (job_index=0, format=0, stream=0x7fff70bb9250) at jobs.c:1630
#1 0x0000000100032ae3 in notify_of_job_status () at jobs.c:3561
#2 0x0000000100031e21 in waitchld (wpid=-1, block=0) at jobs.c:3202
#3 0x0000000100031a1a in sigchld_handler (sig=20) at jobs.c:3049
#4
#5 0x00007fff85a9f464 in read ()
#6 0x00000001000b39a9 in rl_getc (stream=0x7fff70bb9120) at input.c:471
#7 0x00000001000b3940 in rl_read_key () at input.c:448
#8 0x0000000100097c88 in readline_internal_char () at readline.c:517
#9 0x0000000100097dba in readline_internal_charloop () at readline.c:579
#10 0x0000000100097de6 in readline_internal () at readline.c:593
#11 0x0000000100097842 in readline (prompt=0x100205f80 "noname:~ $ ") at readline.c:342
#12 0x0000000100007ab7 in yy_readline_get () at parse.y:1443
#13 0x0000000100007bbe in yy_readline_get () at parse.y:1474
#14 0x00000001000079d1 in yy_getc () at parse.y:1376
#15 0x000000010000888d in shell_getc (remove_quoted_newline=1) at parse.y:2231
#16 0x0000000100009a22 in read_token (command=0) at parse.y:2908
#17 0x00000001000090c1 in yylex () at parse.y:2517
#18 0x000000010000466a in yyparse () at y.tab.c:2014
#19 0x00000001000042fb in parse_command () at eval.c:228
#20 0x00000001000043ef in read_command () at eval.c:272
#21 0x0000000100004088 in reader_loop () at eval.c:137
#22 0x0000000100001e4d in main (argc=2, argv=0x7fff5fbff528, env=0x7fff5fbff540) at shell.c:749
(gdb) detach
(gdb) quit
] На Unix: []nc -l 192.168.1.10 32849[
][
]On Windows: []telnet 192.168.1.10 32849[
][
]Где 32849 - произвольный порт, разрешенный правилами брандмауэра, а IP - IP-адрес прослушивающей машины Unix. []nc[
] - это утилита netcat.[
Есть интересный инструмент, который позволяет выполнять команды windows из Linux, его название winexe
.
Таким образом, вы можете отправить сообщение с того же самого компьютера на консоль, просто набрав его:
winexe -U domain/user%password --interactive=1 //WindowsMachine "msg console \"Ваше сообщение идет здесь.\"
Как вы видите ответ noleti гораздо проще, но с помощью winexe вы также можете открыть вычисление или что угодно на этой машине. Мы использовали его для выполнения автоматической установки на машины с Windows из пакетного сценария в Linux. Довольно круто и экономия времени...
Как насчет NET SEND {name1 | * | /DOMAIN[:name] | /USERS} сообщения
на машине windows, и echo "message" | smbclient -M name2
на linux box? name1 и name2 - это сетевые имена машин.
Идея из ответа projectdp: netcat на linux служит telnet на выигрыш. Нужно, чтобы -p
и разные IP-адреса на двух машинах, однако:
В Linux:
netcat -l 10.0.0.2 -p 14415
- если ваши windows находятся на 10.0.0.2
в Windows: telnet 10.0.0.1 14415
- если ваш linux находится на 10.0.0.1
, чтобы выйти из telnet нажмите ^]
, что означает Ctrl+], а затем введите q
.
Для выбора произвольного порта, как 14415
, удобная таблица находится по адресу Давида Вереба.
Однако на win7 x64 мне пришлось сначала включить telnet, короче говоря:
c:\windows\sysnative\dism.exe /online /norestart /logpath: "c:\foo. txt" /enable-feature /ignorecheck /featurename: "TelnetClient"
Проблема в первоначальной попытке заключалась в том, что pkgmgr
пытался использовать 32-битный dism
и скулил для 64-битного. Идея sysnative
пришла мне от Османа Шенера.
Устанавливается на c:\windows\sysnative\telnet.exe
. Я ставлю c:\windows\sysnative
в переменную окружения PATH с помощью sysdm.cpl
.
Если у вас есть DeVuan или Ubuntu для Linux, sudo apt-get установить netcat-традиционный
Чат выглядел так: