我目前正在探索 Linux 系统上的进程管理,并遇到一个有趣的问题:如何创建一个直接链接到 init 进程的子进程,该进程的 PPID(父进程 ID)通常为 1?
在我的Ubuntu 服务器上,我运行命令dotnet myapplication.dll
来启动应用程序。随后它会在屏幕上显示稳定的输出记录流。
我希望能够执行此操作,断开与进程的连接,执行一些其他任务,然后重新建立与我最初查看的相同的会话/输出。
由于 Ubuntu 是一流的多任务操作系统,我认为这是可能的,也许可以通过使用ps
、pstree
、pgrep
、pkill
、lsof
、top
、nice
或renice
其他一些类似的命令。
我确实理解日志文件,并且tail
将是一个更优化的解决方案,但这就是我目前必须处理的问题。
我打开了一个终端,sudo su
通过将其运行为 来在后台运行 Nano 编辑器nano&
。
我尝试在进程列表中找到新启动的nano进程。
为此,我输入了
ps aux|grep -i nano
-> 看到了新创建的nano
但是当我尝试使用 pstree 查看相同的纳米过程时,它没有列出纳米。我用了
pstree -p|grep -i nano
没有显示输出。
最近有几个问题询问为什么 Ubuntu 似乎使用了比进程/服务所占的内存更多的内存 -这里和这里。
但是,我的情况正好相反。在我的服务器上,所有进程使用的内存似乎都高于使用的总内存。让我提供证据。
输出free -m
:
total used free shared buff/cache available
Mem: 64277 15014 34424 31 14837 48530
Swap: 8191 0 8191
输出arcstat
:
time read miss miss% dmis dm% pmis pm% mmis mm% size c avail
09:38:57 0 0 0 0 0 0 0 0 0 9.8G 9.8G 41G
输出ps aux | awk '{sum +=$6}END{print sum}'
:
6351512
所以这对我来说意味着:
free -m
报告总共使用了 15.0 GB 内存(共享内存可以忽略不计)。arcstat
从ZFS ARC 缓存报告的这个 9.8 GB 中减去。剩余的结果是大约 5.2 GB 的“真实”使用内存。但是(RSS - 驻留集大小)中第 6 列的ps aux
总和为 6.35 GB。这意味着报告的所有进程使用的内存比实际显示的高 1.15 GB free -m
。
我想知道是否有一种方法可以正确计算所有进程使用的内存,使其与使用的内存相匹配(减去 ZFS 缓存和共享 ramdisks 之后)?
xterm -hold
我可以通过键入xkill
然后单击鼠标左键来终止打开的终端。但我想避免点击。我本来以为
xkill -id `echo $$`
会工作,但会引发错误。有人可以告诉我如何做到这一点吗?
我正在运行 python 脚本来获取数据并将其放入数据库中,这在 Ubuntu 20.04 headless 上可能需要一天甚至更长的时间,如下所示:
stdbuf -o0 -e0 -i0 /path/v3_start_fetch.sh >> /path/logs/v3_cronlog_start_fetch__`date +\%Y\%m\%d\%H\%M\%S`___.log 2>&1 &
剧本:
. /path/env_project_auto/bin/activate
cd /path/working_scripts
python -u v3_updater_direct.py
每个异常也将被记录到 MySQL 数据库中。
问题:每次我运行任何脚本(我尝试了几个不同的脚本)时,它似乎都在完全相同的时间停止,即 23:36。有最后一个日志条目(每秒生成多个日志条目)。不管脚本是提前一小时还是 15 小时运行,停止时间总是相同的。
在系统日志中似乎有指向问题的可疑内容,但我无法理解它是什么,因为所有有关的条目Stopping User Manager for UUID xxx
似乎都与这样的 NVidia 启动问题有关,而这个问题没有得到解答。
日志条目:
Oct 30 23:25:01 torbenserver02 CRON[12977]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
Oct 30 23:26:01 torbenserver02 CRON[12986]: (torben) CMD (echo "`date +%Y%m%d%H%M%S`: `dig +short torben.ddns.net`" >> /home/torben/Projects/ip.log)
Oct 30 23:26:08 torbenserver02 systemd[1]: session-975.scope: Succeeded.
Oct 30 23:26:18 torbenserver02 systemd[1]: Stopping User Manager for UID 1000...
Oct 30 23:26:18 torbenserver02 systemd[11289]: Stopped target Main User Target.
Oct 30 23:26:18 torbenserver02 systemd[11289]: Stopped target Basic System.
Oct 30 23:26:18 torbenserver02 systemd[11289]: Stopped target Paths.
Oct 30 23:26:18 torbenserver02 systemd[11289]: Stopped target Sockets.
Oct 30 23:26:18 torbenserver02 systemd[11289]: Stopped target Timers.
Oct 30 23:26:18 torbenserver02 systemd[11289]: dbus.socket: Succeeded.
Oct 30 23:26:18 torbenserver02 systemd[11289]: Closed D-Bus User Message Bus Socket.
Oct 30 23:26:18 torbenserver02 systemd[11289]: dirmngr.socket: Succeeded.
Oct 30 23:26:18 torbenserver02 systemd[11289]: Closed GnuPG network certificate management daemon.
Oct 30 23:26:18 torbenserver02 systemd[11289]: gpg-agent-browser.socket: Succeeded.
Oct 30 23:26:18 torbenserver02 systemd[11289]: Closed GnuPG cryptographic agent and passphrase cache (access for web browsers).
Oct 30 23:26:18 torbenserver02 systemd[11289]: gpg-agent-extra.socket: Succeeded.
Oct 30 23:26:18 torbenserver02 systemd[11289]: Closed GnuPG cryptographic agent and passphrase cache (restricted).
Oct 30 23:26:18 torbenserver02 systemd[11289]: gpg-agent-ssh.socket: Succeeded.
Oct 30 23:26:18 torbenserver02 systemd[11289]: Closed GnuPG cryptographic agent (ssh-agent emulation).
Oct 30 23:26:18 torbenserver02 systemd[11289]: gpg-agent.socket: Succeeded.
Oct 30 23:26:18 torbenserver02 systemd[11289]: Closed GnuPG cryptographic agent and passphrase cache.
Oct 30 23:26:18 torbenserver02 systemd[11289]: pk-debconf-helper.socket: Succeeded.
Oct 30 23:26:18 torbenserver02 systemd[11289]: Closed debconf communication socket.
Oct 30 23:26:18 torbenserver02 systemd[11289]: snapd.session-agent.socket: Succeeded.
Oct 30 23:26:18 torbenserver02 systemd[11289]: Closed REST API socket for snapd user session agent.
Oct 30 23:26:18 torbenserver02 systemd[11289]: Reached target Shutdown.
Oct 30 23:26:18 torbenserver02 systemd[11289]: systemd-exit.service: Succeeded.
Oct 30 23:26:18 torbenserver02 systemd[11289]: Finished Exit the Session.
Oct 30 23:26:18 torbenserver02 systemd[11289]: Reached target Exit the Session.
Oct 30 23:26:18 torbenserver02 systemd[1]: [email protected]: Succeeded.
Oct 30 23:26:18 torbenserver02 systemd[1]: Stopped User Manager for UID 1000.
Oct 30 23:26:18 torbenserver02 systemd[1]: Stopping User Runtime Directory /run/user/1000...
Oct 30 23:26:18 torbenserver02 systemd[1]: run-user-1000.mount: Succeeded.
Oct 30 23:26:18 torbenserver02 systemd[1]: [email protected]: Succeeded.
Oct 30 23:26:18 torbenserver02 systemd[1]: Stopped User Runtime Directory /run/user/1000.
Oct 30 23:26:18 torbenserver02 systemd[1]: Removed slice User Slice of UID 1000.
Oct 30 23:27:01 torbenserver02 CRON[13038]: (torben) CMD (echo "`date +%Y%m%d%H%M%S`: `dig +short torben.ddns.net`" >> /home/torben/Projects/ip.log)
Oct 30 23:28:01 torbenserver02 CRON[13046]: (root) CMD ( test -x /etc/cron.daily/popularity-contest && /etc/cron.daily/popularity-contest --crond)
编辑数据库在本地运行,没有配置备份。在我关闭所有 SSH shell 之后,它似乎发生了任意时间,通常大约 1-2 小时。当我在这个周末的下午停止工作时,它发生在白天非常不同的时间。当我直接在机器上通过终端运行作业时,它似乎也不会发生。所以我做了这里描述的事情,并会尝试重现这个错误,看看它是否有帮助。
我花了一整天的时间试图找到我的问题的答案,但没有运气,所以我决定在这里写。我不是Linux专家,如果我的问题很愚蠢,请原谅。我在我的 中看到以下消息/var/log/syslog
:
applications kernel: [24592.875919] [UFW BLOCK] IN= OUT=ens18 SRC=192.168.1.100 DST=91.189.89.199 LEN=76 TOS=0x10 PREC=0x00 TTL=64 ID=36213 DF PROTO=UDP SPT=33338 DPT=123 LEN=56
其中 192.168.1.100 是我服务器的 IP 地址。请注意,我定义了 UFW 规则,因此除非绝对必要,否则不会打开传出或传入端口,因此阻止此类请求是正确的操作。现在我的猜测是我的服务器中某处有一个恶意文件每 30 分钟左右触发一次(这是它在日志中显示的频率)但是,每次尝试的目标 IP 和 SPT 都不同。现在我想找到可执行文件/进程/或导致此消息的任何内容,但到目前为止还没有运气!
我将不胜感激您的任何帮助。
在我的脚本中,我有以下内容:
cat list | xargs -P6 -n2 ./first_queue &
wherelist
只是一个包含我要处理的单词对的文件:
单词1 单词2
字3字4
ETC...
first_queue
只是另一个脚本。我试图在调用它之后立即获取由此 xargs 生成的所有 6 个进程的 pid,以便以后可以终止它们。我读到它$!
给出了在后台运行的最后一个进程的 pid。但是,我想要所有 6 个。我怎样才能得到它们?
更多细节:
我编写了以下小脚本来测试@xenoid 的建议:
cat list | xargs -P6 -n2 ./first_queue &
id=$(echo $!)
echo $id
ids=$(pgrep -P $id)
echo $ids
ps aux | grep $id
for x in $ids; do
echo $x
ps aux | grep $x
kill $x
done
kill $id
ps aux | grep $id
for x in $ids; do
ps aux | grep $x
done
这是非常简化的(对于给我带来麻烦的命令,尽管在父进程(即 xargs 以及子进程)上first_queue
运行,但它仍在运行):kill
srr=$1
bioproject=$2
prefetch $srr -O download_dir/$bioproject
prefetch
只需从在线数据库下载数据。