我想发送一个这样的heredoc命令
cat <<EOF
line 1
line 2
EOF
背景。(实际的命令openssl
包含多行输入,需要一些时间才能完成)。
该命令需要以字符串形式存储,以便我可以exec
在 PHP 中使用它。
简单地附加一个 & 号是行不通的:
cat <<EOF
line 1
line 2
EOF &
我尝试过的任何其他组合(将命令放在括号中等)也不起作用。
如何?
我想发送一个这样的heredoc命令
cat <<EOF
line 1
line 2
EOF
背景。(实际的命令openssl
包含多行输入,需要一些时间才能完成)。
该命令需要以字符串形式存储,以便我可以exec
在 PHP 中使用它。
简单地附加一个 & 号是行不通的:
cat <<EOF
line 1
line 2
EOF &
我尝试过的任何其他组合(将命令放在括号中等)也不起作用。
如何?
是否可以使用命令列出所有正在运行的后台进程ps
,或者是获取后台进程列表的唯一选项jobs
?
我在我的服务器(以及所有 debian 衍生服务器)上出现注销问题,但不会杀死所有用户进程。
我似乎理解这是出于工作站效率的原因(假设似乎是同一用户将在此后不久登录)。
例如,在一个非常受限的帐户上,我得到:
mcon@cinderella:~$ pgrep --list-full -U gamer
3001599 /lib/systemd/systemd --user
3001600 (sd-pam)
3001615 /usr/bin/pipewire
3001616 /usr/bin/pipewire-media-session
3001624 /usr/bin/dbus-daemon --session --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only
3001706 /usr/libexec/gvfsd
3001711 /usr/libexec/gvfsd-fuse /run/user/1002/gvfs -f
3001839 /usr/libexec/dconf-service
3001841 /usr/libexec/gvfs-udisks2-volume-monitor
3001852 /usr/libexec/gvfs-gphoto2-volume-monitor
3001860 /usr/libexec/gvfs-goa-volume-monitor
3001888 /usr/libexec/goa-daemon
3001906 /usr/libexec/goa-identity-service
3001908 /usr/libexec/gvfs-mtp-volume-monitor
3001915 /usr/libexec/gvfs-afc-volume-monitor
3002093 /usr/libexec/evolution-source-registry
3002108 /usr/libexec/gvfsd-trash --spawner :1.9 /org/gtk/gvfs/exec_spaw/0
3002112 /usr/libexec/xdg-desktop-portal
3002120 /usr/libexec/xdg-document-portal
3002124 /usr/libexec/xdg-permission-store
3002132 fusermount3 -o rw,nosuid,nodev,fsname=portal,auto_unmount,subtype=portal -- /run/user/1002/doc
3002150 /usr/libexec/evolution-calendar-factory
3002162 /usr/libexec/gvfsd-metadata
3002176 /usr/libexec/evolution-addressbook-factory
3002227 /usr/libexec/bluetooth/obexd
3002924 /usr/bin/python3 /usr/share/system-config-printer/applet.py
3827100 /usr/bin/gnome-keyring-daemon --start --foreground --components=secrets
gamer
这是在用户注销和其他用户(包括我自己)使用系统之后花费了(很多)小时。
我见过这个问题,但这不适用于我的情况:我不想阻止用户通过nohup
or显式启动长时间运行的进程screen
,而只是杀死所有“无用”的系统任务。
我尝试设置[Login]
-> KillUserProcesses=yes
in/etc/systemd/logind.conf
但显然没有任何改变。
请注意,对于曾经登录的每个用户,所有这些进程都保持活动状态(当然,自上次重新启动以来)。
我如何摆脱所有这些过程?真的需要运行一些cron
脚本来杀死它们吗?如果是这样:我如何将“明确需要”的后台进程与系统垃圾分开?
PS:我知道 StackExchange 政策是“每个 OP 一个问号”,但这些实际上是同一个问题的各个方面。
执行以下脚本
#!/usr/bin/bash
while true
do
ab -c 700 -n 100000000000 -r http://crimea-post.ru/ >>crimea-post & ab -c 700 -n 100000000000 -r http://nalog.gov.ru/ >>nalog
done
做完全一样的
#!/usr/bin/bash
while true
do
ab -c 700 -n 100000000000 -r http://crimea-post.ru/ >>crimea-post
ab -c 700 -n 100000000000 -r http://nalog.gov.ru/ >>nalog
done
根据我的经验,第一个脚本比第二个脚本(超过 10 分钟后)更快地创建nalog
文件(几秒钟内),这向我表明后者等待ab -c 700 -n 100000000000 -r http://nalog.gov.ru/ >>nalog
完成。它不应该是这样的,因为从我到目前为止的研究来看,第二个脚本是在ab -c 700 -n 100000000000 -r http://nalog.gov.ru/ >>nalog
不等待ab -c 700 -n 100000000000 -r http://crimea-post.ru/ >>crimea-post
完成的情况下开始的。我希望这两个ab
命令同时执行,我如何在 Bash 中完成这个?
PS它是&
和不是&&
。我知道什么&&
可以和不想在这里应用它。
我在后面上传东西并想锁定屏幕,但不确定lock
gnome 中的功能是否会在允许继续的同时锁定屏幕。
到目前为止,计算机似乎没有进入休眠状态,这很好,但它会一直这样吗?我不想让它进入睡眠状态。
我有一个 shell 脚本,它有 3 个程序:
#!/bin/bash
x
y
z
以上每个程序都是二进制的,必须按顺序运行。程序y
是一个守护进程。当 bash 运行时x
,它是好的,当y
运行时,z
不能运行。我运行 y 等nohup y &
但z
无法运行。
我怎样才能在诸如非阻塞编程z
之后运行?y
我有一个可执行的二进制文件(它是一个设备驱动程序)。它运行并立即以成功的 0 返回码退出。在一台计算机上,它创建了我可以用 pgrep 看到的所有重要的子进程,但遗憾的是在我的另一台计算机上没有。运行它的输出strace
结束:
clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f2851597310) = 32167
exit_group(0) = ?
+++ exited with 0 +++
但是在那台计算机上找不到进程(在本例中为 32167)。
我不知道如何弄清楚出了什么问题。sudo execsnoop -x
跑步对孩子没有任何影响。源代码不可用。(不是主要目标,但如果它不克隆而只是在前台运行所有内容,那就太好了。)如果有帮助,就是这个文件:https ://github.com/elmadjian/tobii_4C_for_linux/blob/main/tobii_usb_service /usr/local/sbin/tobiiusbserviced
编辑:strace -f command
输出结束:
23747 clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f789577f310) = 23748
23747 exit_group(0) = ?
23748 umask(000) = 022
23748 setsid( <unfinished ...>
23747 +++ exited with 0 +++
23748 <... setsid resumed>) = 23748
23748 brk(NULL) = 0x21bd000
23748 brk(0x21de000) = 0x21de000
23748 openat(AT_FDCWD, "/var/run/tobiiusb/tobiiusbservice.pid", O_WRONLY|O_CREAT|O_TRUNC, 0666) = -1 ENOENT (No such file or directory)
23748 openat(AT_FDCWD, "/etc/localtime", O_RDONLY|O_CLOEXEC) = 3
23748 fstat(3, {st_mode=S_IFREG|0644, st_size=3648, ...}) = 0
23748 fstat(3, {st_mode=S_IFREG|0644, st_size=3648, ...}) = 0
23748 read(3, "TZif2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\0\0\0\7\0\0\0\0"..., 4096) = 3648
23748 lseek(3, -2321, SEEK_CUR) = 1327
23748 read(3, "TZif2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\0\0\0\7\0\0\0\0"..., 4096) = 2321
23748 close(3) = 0
23748 socket(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC, 0) = 3
23748 connect(3, {sa_family=AF_UNIX, sun_path="/dev/log"}, 110) = -1 ENOENT (No such file or directory)
23748 close(3) = 0
23748 exit_group(1) = ?
23748 +++ exited with 1 +++
我需要检索通过管道传输到另一个进程的进程的 PID,这些进程一起作为 bash 中的后台作业生成。以前我只是依靠pgrep
,但事实证明在pgrep
能够找到该过程之前可能会有> 2s的延迟:
#!/bin/bash
cmd1 | cmd2 &
pid=$(pgrep cmd1) # emtpy in about 1/10
我发现针对这个问题的一些常见建议是使用进程替换而不是简单的管道 ( cmd1 >(cmd2) & pid=$!
) 或使用jobs
内置函数。进程替换运行整个子shell(对于整个运行时),所以我现在宁愿使用jobs
,但我想避免两次犯同样的错误......
jobs
如果我在生成它们后立即执行查找,我可以 100% 依赖于了解这两个进程吗?
#!/bin/bash
cmd1 | cmd2 &
pid=$(jobs -p %cmd1) # 10/10?
这可能是由于在后台运行作业,或者可能是一个怪癖set -x
,但以下示例通常以任何顺序列出执行的命令。到目前为止,输出似乎是正确的,但我想完全排除在jobs
作业开始之前jobs
可以执行的可能性(或者至少不会列出两个进程)!?jobs
#!/bin/bash
set -x
tail -f /dev/null | cat &
jobs -l
kill %tail
例子:
+ jobs -l
[1]+ 2802325 Running tail -f /dev/null
2802326 | cat &
+ tail -f /dev/null
+ kill %tail
同样,在流程替换的情况下,我可以依靠pid=$!
始终工作吗?它到底是为了“扩展到最近执行的后台(异步)命令的进程ID”而设计的?
我编写了一个 bash 函数,它接受命令作为参数,在后台运行它,并允许用户通过按任意键来终止命令。这部分工作正常。
但是,当我将它通过管道传输到whiptail
对话框仪表时,whiptail 按预期运行,但在它返回后,终端将不再显示按键。我仍然可以运行命令,只是看不到我正在输入的内容打印到屏幕上。输出的格式也很奇怪,stdout 出现在$
.
我很确定该read
命令是造成这种行为的原因,但我不明白为什么。任何人都可以提供任何见解吗?
#!/bin/bash
function killOnKeypress() {
local runcommand="${1}"
local args=(${@:2})
# Run the command in the background
"${runcommand}" ${args[@]} &
# Get the process id of $runcommand
local pid=$!
# Monitor $runcommand and listen for keypress in foreground
while kill -0 "${pid}" >/dev/null 2>&1; do
# If key pressed, kill $runcommand and return with code 1
read -sr -n 1 -t 1 && kill "${pid}" && return 1
done
# Set $? to return code of $runcommand
wait $pid
# Return $runcommand's exit code
return $?
}
function count100() {
for ((i = 0; i < 100; i++)); do
echo $i
sleep .02
done
}
killOnKeypress "count100" | whiptail \
--gauge "Counting to 100" \
16 56 \
0
当我将 cat 命令作为后台进程运行时,
$ cat &
然后尝试杀死它,
$ killall -v cat
它说它用信号 15 杀死了猫,但这只猫只是被停止了。运行后$ ps
,我看到它仍在运行。直到我打电话$ fg
,它才最终被终止。
好像和等待输入有关,因为在c++中模拟cat的时候,
string line;
while(getline(cin, line))
cout << line << endl;
同样的事情发生了,但是对于一个简单的while(true);
循环,该进程被成功杀死。
它似乎也是一个后台进程,因为当我$ cat
在另一个终端运行时$ killall -v cat
它也可以正常工作。
这里发生了什么?提前致谢。