此问题是以下问题的后续:如何暂停和恢复进程
我已经从 gnome-terminal 中的 bash 会话启动了 firefox。
进程树如下所示:
$ ps -e -o pid,ppid,cmd -H
1828 1 gnome-terminal
26677 1828 bash
27980 26677 /bin/sh /usr/lib/firefox-3.6.15/firefox
27985 27980 /bin/sh /usr/lib/firefox-3.6.15/run-mozilla.sh /usr/lib/firefox-3.6.15/firefox-bin
27989 27985 /usr/lib/firefox-3.6.15/firefox-bin
28012 27989 /usr/lib/firefox-3.6.15/plugin-container /usr/lib/adobe-flashplugin/libflashplayer.so 27989 plugin true
Run Code Online (Sandbox Code Playgroud)
当我CTRL+Z使用 bash 时,它会暂停 Firefox。当我发出命令bg(或fg)时,它将恢复 Firefox。这正如预期的那样。
当我kill -s SIGTSTP 27980在另一个终端中发出命令时,它会[1]+ Stopped firefox在第一个终端中打印该行(就像我点击时一样CTRL+Z),但它不会挂起 firefox。我假设它只挂起 shell 脚本。
当我kill -s SIGTSTP 27989在另一个终端中发出命令(注意 PID)时,它会挂起 Firefox。第一终端没有注意到这一点。
bash 如何挂起整个进程树?它是否只是遍历树和 SIGTSTP 所有的孩子?
我使用 telnet 连接到终端服务器,该服务器将流量代理到 RS-232 端口。
不幸的是,在使用某些设备时,无法发送CTRL+C字符 (0x03)。似乎本地客户端没有传输字符,而是捕获了按键,而我处于“其他模式”。我想要的只是发送一个角色。
为了调试这个,我一直在玩:
^] toggle termdata
Run Code Online (Sandbox Code Playgroud)
和
^] toggle options
Run Code Online (Sandbox Code Playgroud)
当我在无法工作的终端服务器上按CTRL+时会发生以下情况C:
telnet 10.10.129.101 2012
Trying 10.10.129.101...
Connected to termserv-val3 (10.10.129.101).
Escape character is '^]'.
^]
telnet> toggle options
Will show option processing.
^]
telnet> toggle termdata
Will print hexadecimal representation of terminal traffic.
SENT IAC IP
SENT DO TIMING MARK
Run Code Online (Sandbox Code Playgroud)
以下是在正常工作的终端服务器上发生的情况:
telnet termserv-val2 2012
Trying 10.10.128.93...
Connected to termserv-val2 (10.10.128.93).
Escape character is '^]'.
telnet> toggle options …Run Code Online (Sandbox Code Playgroud) 我正在使用dd网络将磁盘映像传输到 BeagleBone 上的 SD 卡。
pkill -USR1 -n -x dd在与此 BeagleBone 的 ssh 连接中使用为我提供了传输过程的状态更新,这很棒。我只是好奇它是如何实际工作的,以便我将来可以有效地使用它。
阅读man pkill后仍然没有完全解释如何pkill -USR1 -n -x dd为我提供这个非常有用的状态更新。
我正在开发一个应用程序,我希望它根据需要将一些运行时统计信息打印到控制台。kill我立刻想到了信号。
阅读Wiki 上的Unix 信号,SIGINFO似乎是要走的路,因为:
SIGUSRx- 请参阅此处相反)但是,通过检查 的输出kill -l,似乎我的服务器没有实现此信号。
SIGINFO我的系统上没有?它在所有 GNU Linux 系统上都不存在吗?Linux元信息:
Linux whatever 3.18.2-2-ARCH #1 SMP PREEMPT Fri Jan 9 07:37:51 CET 2015 x86_64 GNU/Linux
更新:我仍在寻找有关为什么此信号被有条件地排除在 BSD 之外的其他系统之外的更多信息(请参阅下面的评论)。该信号似乎对许多用途都非常有用,所以我很难相信这只是一个心血来潮的问题 - 那么这个信号在 Linux 上的真正表现是什么?
运行时,service apache start我在日志文件中看到此条目:
[mpm_event:notice] [pid 1906:tid XXX] AH00489: Apache/2.4.23 (Unix)
OpenSSL/1.0.2g PHP/7.0.9 configured -- resuming normal operations
[core:notice] [pid 1906:tid XXX] AH00094: Command line: '/usr/sbin/httpd'
[mpm_event:notice] [pid 1906:tid XXX] AH00492: caught SIGWINCH, shutting down gracefully
Run Code Online (Sandbox Code Playgroud)
并且服务apache没有启动?我可以在互联网上找到SIGWINCH[ Window size change] 的含义,但在这种情况下它并没有真正帮助我。
该文件/etc/systemd/system/apache.service:
[Unit]
Description=The Apache Webserver [FaF Compiled]
After=network.target nss-lookup.target time-sync.target
Before=getty@tty1.service plymouth-quit.service xdm.service
[Service]
Type=notify
PrivateTmp=true
ExecStart=/usr/sbin/httpd -k start
ExecReload=/usr/sbin/httpd -k graceful
ExecStop=/usr/sbin/httpd -k graceful-stop
KillMode=mixed
[Install]
WantedBy=multi-user.target
Alias=httpd.service apache.service
Run Code Online (Sandbox Code Playgroud)
在 …
假设我有这个 script.sh
#!/bin/bash
exit_script() {
echo "Printing something special!"
echo "Maybe executing other commands!"
kill -- -$$ # Sends SIGTERM to child/sub processes
}
echo "Some other text"
#other commands here
sleep infinity
Run Code Online (Sandbox Code Playgroud)
我想在它收到或
例如时script.sh执行该函数:exit_scriptSIGINTSIGTERM
killall script.sh # it will send SIGTERM to my script
Run Code Online (Sandbox Code Playgroud)
我希望我的脚本执行这个
exit_script() {
echo "Printing something special!"
echo "Maybe executing other commands!"
kill -- -$$ # Sends SIGTERM to child/sub processes
}
Run Code Online (Sandbox Code Playgroud)
我尝试使用 trap
trap exit_script SIGINT SIGTERM
Run Code Online (Sandbox Code Playgroud)
回答我问题的人证明我错了。
但它不起作用,因为 …
我有以下脚本:
#!/bin/bash
echo "We are $$"
trap "echo HUP" SIGHUP
cat # wait indefinitely
Run Code Online (Sandbox Code Playgroud)
当我发送SIGHUP(使用kill -HUP pid)时,没有任何反应。
如果我稍微更改脚本:
#!/bin/bash
echo "We are $$"
trap "kill -- -$BASHPID" EXIT # add this
trap "echo HUP" SIGHUP
cat # wait indefinitely
Run Code Online (Sandbox Code Playgroud)
...然后脚本在echo HUP退出时做正确的事情(当我按 Ctrl+C 时):
roger@roger-pc:~ $ ./hupper.sh
We are 6233
^CHUP
Run Code Online (Sandbox Code Playgroud)
这是怎么回事?我应该如何SIGHUP向此脚本发送信号(不一定必须是)?
我ssh编辑到我的服务器并运行wget -r -np zzz.aaa/bbb/ccc它开始工作。然后我的Internet连接(我家)中断了,我开始担心假设wget已经hupPED因为ssh连接丢失,因此终端已经死了。但是后来我ssh在我的服务器上发现它仍在运行,并将输出放入wget.log并下载内容。有人可以向我解释一下这里可能发生了什么吗?
这就是ps给我的:
PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
32283 0.6 29.4 179824 147088 ? S 14:00 1:53 wget -r -np zzz.aaa/bbb/ccc
Run Code Online (Sandbox Code Playgroud)
它?在列中(问号)是什么意思tty?
我读了一个声称正在运行的用户的答案
foo 2>&1 >& output.log &
Run Code Online (Sandbox Code Playgroud)
foo即使他们注销,也会导致继续运行。据该用户称,这甚至可以通过 SSH 连接工作。
我并不真正相信这一点,因为我的印象是,在与 SSH 断开连接或终止 TTY 的情况下,shell 及其进程会收到 SIGHUP,导致它们终止。这一点,我的假设下,被使用的唯一理由nohup在这样的情况下,或者tmux,screen等。
然后我查看了glibc 的手册:
该信号还用于向与该会话相关联的作业报告终端上控制进程的终止;此终止有效地断开会话中的所有进程与控制终端的连接。
这似乎证实了我的想法。但进一步看,它说:
如果进程是具有控制终端的会话领导者,则向前台作业中的每个进程发送 SIGHUP 信号,并且控制终端与该会话解除关联。
那么,这是否意味着置于后台的作业将不会收到 SIGHUP?
令我更加困惑的是,我运行了一个交互式 Zsh 会话,运行yes >& /dev/null &并输入了exit,当 Zsh 警告我有正在运行的作业时,exit第二次输入后,它告诉我它已经 SIGHUPed 一个作业。在 Bash 中执行完全相同的操作会使工作继续运行……
是否有与Solaris 实用程序的-T和-U选项truss在 Linux 上执行的等效项。
这些是指定一个系统调用 ( -T) 或库函数 ( -U),当被跟踪应用程序调用时会导致它停止。
或者,换句话说,我希望被跟踪的应用程序启动的任何进程在执行给定的系统调用或给定的共享库函数调用后立即停止(就像被 SIGSTOP 杀死一样)。
strace并且ltrace在 Linux 上提供了 Solaris 的许多功能集truss,但他们似乎没有这样做。
例如:
truss -f -T open cmd
Run Code Online (Sandbox Code Playgroud)
会是这样strace -f cmd,只是如果在执行过程中cmd或任何其后代做任何open系统调用时,它会立即停止(我可以在我方便以后恢复它)
在某些情况下,我可以使用gdb's catch syscall,但我正在寻找一种可以方便地跟踪分叉并继续为所有分叉进程执行此操作的解决方案,即使在execves之后也继续执行此操作。
我似乎记得一些实用程序提供了相同的功能,甚至是一个(或同一实用程序的选项)在某些远程系统调用之间的单步应用程序,但我的记忆力让我失望,我什至无法确定那是在 Linux 上。
signals ×10
bash ×2
linux ×2
process ×2
ssh ×2
terminal ×2
apache-httpd ×1
dd ×1
debugging ×1
glibc ×1
job-control ×1
kill ×1
scripting ×1
serial-port ×1
services ×1
shell-script ×1
suse ×1
system-calls ×1
systemd ×1
telnet ×1
truss ×1
tty ×1
wget ×1