小编Adm*_*Bee的帖子

Systemd 和进程生成:主进程退出时子进程被杀死

通常不在这里发帖,但我正在为这个发帖。我有一个 Python 脚本,它在启动时分叉,并负责启动一堆其他进程。这个脚本曾经在启动时sysvinit通过systemd.

不幸的是,我遇到了一个无法解决的问题。当您直接在用户 shell 中启动脚本时,它会正确启动它的子进程,而当脚本退出时,子进程将被孤立并继续运行。

当通过 systemd 启动时,如果父进程退出,子进程也会全部退出(好吧,screen它们在 die 中启动并显示为 Dead)。

理想情况下,我需要能够在不杀死所有子进程的情况下重新启动父脚本,我是否遗漏了什么?

谢谢!

[Unit]
Description=Server commander
After=network.target

[Service]
User=serveruser
Type=forking
PIDFile=/var/Server/Server.pid

ExecStart=/var/Server/Server.py
ExecStop=/bin/kill -s TERM $MAINPID

[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)

编辑:

我可能需要指出 Python 脚本本质上是其子进程的“控制器”。它screen根据中央服务器的请求启动和停止 GNU 中的服务器。它通常一直在运行,它不会产生服务并退出。

然而,在某些情况下,我希望能够在不杀死子进程的情况下重新加载脚本,即使这意味着进程被孤立到 pid 1。事实上,如果 Python 脚本从进程开始,则无关紧要父进程,如果可能的话。

更好地解释它是如何工作的:

  • systemd 产卵 Server.py
  • Server.py 派生并写入 pid 文件 systemd
  • Server.py 然后根据其指令在 gnu 屏幕中生成服务器进程
  • Server.py 继续运行以执行从服务器请求的任何重新启动

不使用 的情况下 启动时systemdServer.py可以重新启动并且screens它启动的 GNU不受影响。当使用 启动时systemd,当Server.py关闭时,这些屏幕进程不会被孤立到 pid …

process-management systemd sysvinit

17
推荐指数
2
解决办法
2万
查看次数

如何从 Gnome 桌面将 Unicode 字符输入到 KDE 的 Konsole 终端中?

我使用 Ubuntu。在“侏儒末端”,I可以通过第一输入键入的Unicode码点Ctrl+ Shift+u其次是码点的十六进制值,例如C-S-u 2468产生?

konsole,我的首选终端,没有这个C-S-u(Gnome)功能......

在 Konsole 中是否有一些等效的 KDE 方法来执行此操作?

kde keyboard konsole input-method unicode

16
推荐指数
1
解决办法
6288
查看次数

Systemd 启动后立即终止服务

我正在systemd为 OSSEC HIDS编写单元文件。问题是,当systemd启动服务时,它会立即停止它们。

当我使用以下ExecStart指令时,一切正常。

ExecStart=/var/ossec/bin/ossec-control start
Run Code Online (Sandbox Code Playgroud)

但是当我进行以下小的改进时,我在 OSSEC 日志中发现它SIG 15在启动后收到。

ExecStart=/bin/sh -c '${DIRECTORY}/bin/ossec-control start'
Run Code Online (Sandbox Code Playgroud)

如果我再做一个小的更改,服务将SIG 15在 20 秒后收到。

ExecStart=/bin/sh -c '${DIRECTORY}/bin/ossec-control start && sleep 20'
Run Code Online (Sandbox Code Playgroud)

所以,我想,这会在服务启动后systemd杀死/bin/sh进程,/bin/sh然后杀死OSSEC.

我怎么解决这个问题?

kill centos systemd

16
推荐指数
1
解决办法
2万
查看次数

当 Bash“while”循环终止时需要条件函数的退出代码

我试图获取我在 Bash 循环的“条件”部分中重复调用的函数的退出代码while

while <function>; do 
    <stuff> 
done 
Run Code Online (Sandbox Code Playgroud)

当此循环由于错误而终止时,我需要 的退出代码<function>。关于如何得到它有什么想法吗?

bash shell-script error-handling

16
推荐指数
2
解决办法
6435
查看次数

是否可以在不连接的情况下将输入发送到 tmux 会话?

是否有任何命令可用于将输入或命令发送到给定的 tmux 会话/窗格而无需连接到它?

用于无人值守访问,

我有一个在 tmux 会话上运行的控制台应用程序。我想在部署(使用 capistrano)完成后重新启动它。

是否可以?

基本上我想发送:

exit
cd ..
cd app
rails console
Run Code Online (Sandbox Code Playgroud)

tmux input

14
推荐指数
1
解决办法
2万
查看次数

如何根据字母顺序等在脚本/命令行中选择当前目录中文件的子范围?

在文件管理器中,您通常可以选择一个文件,然后按住Shift并选择另一个文件。中间的每个文件都将被选择。

我想做bash/zsh相当于这个。

即:我想给出 2 个文件名,并在中间包含每个文件名(按字母顺序排列 - 输出它们的方式ls)。

我知道? {} *和其他通配符选项,但是我希望能够在名称高度混乱的文件上使用它。

例如:给定文件

$ ls
aoeitoae.txt
oaeistn.txt
oaie.txt
paeoai.txt
sotaoe.txt
Run Code Online (Sandbox Code Playgroud)

我想发出这样的命令rm aoeitoae.txt-oaie.txt,然后得到:

$ ls
paeoai.txt
sotaoe.txt
Run Code Online (Sandbox Code Playgroud)

我怎样才能实现这个目标?

command-line bash zsh wildcards

14
推荐指数
2
解决办法
1956
查看次数

bash -c "&lt;single command&gt;" 的行为是否有记录?

众所周知,当运行时bash -c "COMMAND"(至少在 Linux 的常见版本中),当有一个没有任何元字符(除了spacetabnewline)的命令时,bash -c进程不会分叉,而是将自身替换为COMMAND直接用系统调用执行execve优化,所以结果只会是一个进程。

\n
$ pid=$$; bash -c "pstree -p $pid"\nbash(5285)\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80pstree(14314)\n
Run Code Online (Sandbox Code Playgroud)\n

如果有任何元字符(例如重定向)或多个命令(无论如何都需要一个元字符),bash则会分叉它执行的每个命令。

\n
$ pid=$$; bash -c ":; pstree -p $pid"\nbash(5285)\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80bash(28769)\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80pstree(28770)\n\n$ pid=$$; bash -c "pstree -p $pid 2>/dev/null"\nbash(5285)\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80bash(14403)\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80pstree(14404)\n
Run Code Online (Sandbox Code Playgroud)\n

这是一个未记录的优化功能(这意味着它无法得到保证),还是在某处记录并得到保证?

\n
\n

注意:我认为并非所有版本的bash行为都是如此,并且在某些版本上,它只是被视为实现细节而不是保证,但我想知道是否至少有一些bash版本明确支持这一点并且记录此情况的条件。;例如,如果命令后面有一个字符,没有任何第二个命令,bash仍然execve不会分叉。

\n
$ pid=$$; bash -c "pstree -p $pid ; "\nbash(17516)\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80pstree(17658)\n
Run Code Online (Sandbox Code Playgroud)\n

我的问题的背景

\n

正如我所提到的,这种行为对于经验丰富的用户来说是众所周知的 …

bash exec

14
推荐指数
1
解决办法
1225
查看次数

如何删除落在 /* .... */ 下的所有字符,包括 /* &amp; */?

我确实尝试过sedand awk,但它不起作用,因为字符所涉及的字符/已经在命令中作为分隔符存在。

请让我知道我怎样才能做到这一点。

下面是一个示例示例。我们要删除评论部分,即/*.....*/

/*This is to print the output
data*/
proc print data=sashelp.cars;
run;
/*Creating dataset*/
data abc;
set xyz;
run;
Run Code Online (Sandbox Code Playgroud)

text-processing

13
推荐指数
4
解决办法
1985
查看次数

如何让日语字符在 Arch 上的 Firefox 中正确显示?

我在 Arch Linux 上运行 Firefox 52.0.2,虽然在系统上(例如:在 Nautilus 中)我有日语字符显示正常,但在 Firefox 中它们是不可读的,因为为它们显示的所有内容是这样的:

日语字符在 Firefox 中未正确显示

这是因为我没有安装允许显示为 Firefox 安装的平假名、片假名和汉字的字体。但问题是我不完全确定我是如何为 Firefox 获得这个的。我尝试在 Firefox 中安装日语词典,但这似乎没有任何区别。

那么我必须做什么和安装才能让它们正确显示?因为在这种形式下,阅读和编​​写它们显然非常困难。

character-encoding firefox language

13
推荐指数
1
解决办法
1万
查看次数

将 url 粘贴到终端(urxvt,zsh)失败,一些字符被转义

最近几个月,我发现如果我在 Chrome 中复制 URL,然后在 中 Shift-Insert urxvt,粘贴的 URL 会被转义。

例如,原始网址是:

http://example.com/?a=c
Run Code Online (Sandbox Code Playgroud)

粘贴的内容是:

http://example.com/\?a\=c
Run Code Online (Sandbox Code Playgroud)

但是,如果我将其粘贴到其他地方,例如在 Web 浏览器中或在 中vim,则无法逃脱。

我用的是 Arch Linux, urxvt, zsh,oh-my-zsh.

zsh clipboard rxvt oh-my-zsh

12
推荐指数
2
解决办法
4705
查看次数