change ``bash headers to
``sh
This commit is contained in:
@@ -8,31 +8,31 @@ tags: [ "system", "phone" ]
|
||||
|
||||
Install:
|
||||
|
||||
```bash
|
||||
```sh
|
||||
yay -S simple-mtpfs
|
||||
```
|
||||
|
||||
List available phones:
|
||||
|
||||
```bash
|
||||
```sh
|
||||
simple-mtpfs -l
|
||||
```
|
||||
|
||||
Make a mount point:
|
||||
|
||||
```bash
|
||||
```sh
|
||||
mkdir phone
|
||||
```
|
||||
|
||||
Check your phone, and tell it to allow access to the USB.
|
||||
|
||||
```bash
|
||||
```sh
|
||||
simple-mtpfs --device 1 phone
|
||||
```
|
||||
|
||||
## Stop
|
||||
|
||||
```bash
|
||||
```sh
|
||||
fusermount -u phone
|
||||
rmdir phone
|
||||
```
|
||||
|
90
system/ansible/ansible_basics.md
Normal file
90
system/ansible/ansible_basics.md
Normal file
@@ -0,0 +1,90 @@
|
||||
---
|
||||
title: "Ansible Basics"
|
||||
tags: [ "system", "ansible", "orchestration" ]
|
||||
requires: [ "ssh" ]
|
||||
---
|
||||
|
||||
# Start Locally
|
||||
|
||||
Start by doing normal actions on the computer.
|
||||
|
||||
Say 'hello' to yourself:
|
||||
|
||||
```sh
|
||||
ansible --module-name=ping localhost
|
||||
```
|
||||
|
||||
Upgrade through the package manager.
|
||||
|
||||
`packager=apt` (or `pacman` or `xbps`,...)
|
||||
|
||||
```sh
|
||||
packager=apt
|
||||
ansible --module-name=${packager} --args "upgrade=yes" localhost
|
||||
```
|
||||
|
||||
This fails because you have not 'become root'.
|
||||
So, '*become*'!
|
||||
|
||||
```sh
|
||||
ansible --become -m ${packager} -a "upgrade=true" localhost
|
||||
```
|
||||
|
||||
# Passwords
|
||||
|
||||
Typing the password is dull.
|
||||
You might shift it to the command line:
|
||||
|
||||
ansible-playbook t.yaml -i hosts.yaml -e "ansible_become_password=${password}"
|
||||
|
||||
...this is also dull.
|
||||
|
||||
|
||||
If you have a password store, like `pass`, you can put that in a script:
|
||||
|
||||
|
||||
```sh
|
||||
echo "#!/bin/sh
|
||||
pass $HOSTNAME" > pass.sh
|
||||
|
||||
chmod u+x !$
|
||||
|
||||
ansible --become --module-name=pacman --args "upgrade=true" localhost
|
||||
```
|
||||
|
||||
# Other Hosts
|
||||
|
||||
Find something you can `ssh` into.
|
||||
Ansible will use your `/etc/hosts` file, and `~/.ssh/config`.
|
||||
|
||||
## Make a Hosts File
|
||||
|
||||
You can use the `.ini` format:
|
||||
|
||||
```sh
|
||||
echo '[phones]
|
||||
192.168.0.20' > hosts
|
||||
```
|
||||
But everything uses `yaml` nowadays, so may as well be consistent:
|
||||
|
||||
```yaml
|
||||
all:
|
||||
children:
|
||||
phones:
|
||||
children:
|
||||
pine:
|
||||
ansible_host: 192.168.0.20
|
||||
|
||||
```
|
||||
|
||||
Check the inventory in yaml format:
|
||||
|
||||
```sh
|
||||
ansible-inventory --list -y -i
|
||||
```
|
||||
|
||||
```sh
|
||||
ansible-vault view sec.yml --vault-pass-file pass.sh
|
||||
```
|
||||
|
||||
community.general.say voice=en_GB msg="Testing 123"
|
@@ -8,25 +8,25 @@ See a file's contents:
|
||||
|
||||
Return full contents of a string:
|
||||
|
||||
```bash
|
||||
```sh
|
||||
awk '{ print }' file
|
||||
```
|
||||
|
||||
Print the first and second column:
|
||||
|
||||
```bash
|
||||
```sh
|
||||
awk '{print$1$2}'
|
||||
```
|
||||
|
||||
Return every line with the word 'the' (like grep):
|
||||
|
||||
```bash
|
||||
```sh
|
||||
awk '/the/{print}' file
|
||||
```
|
||||
|
||||
Print everything containing a lowercase letter:
|
||||
|
||||
```bash
|
||||
```sh
|
||||
awk '/[a-z]/{print}' file
|
||||
```
|
||||
|
||||
@@ -34,7 +34,7 @@ Same with numbers [0-9], or using a caret we can show lines starting with a numb
|
||||
|
||||
# Conditionals
|
||||
|
||||
```bash
|
||||
```sh
|
||||
awk '{ if($1 ~ /123/) print }' file
|
||||
```
|
||||
|
||||
@@ -42,19 +42,19 @@ Check if the first column is equal to 1 or 2 or 3, and if so then print that lin
|
||||
|
||||
Grep for 'hawk' in a story:
|
||||
|
||||
```bash
|
||||
```sh
|
||||
awk '/hawk/' story.txt
|
||||
```
|
||||
|
||||
Return any line with one or more "&" sequences:
|
||||
|
||||
```bash
|
||||
```sh
|
||||
awk '/&+/' script.sh
|
||||
```
|
||||
|
||||
The pipe is used for 'or', so 'Orcs or drums' would be:
|
||||
|
||||
```bash
|
||||
```sh
|
||||
awk '/Orcs|Drums/' story.txt
|
||||
```
|
||||
|
||||
|
@@ -47,7 +47,7 @@ The `rm' program takes arguments, but not `stdin' from a keyboard, and therefore
|
||||
To fix this, use `xargs` to turn the stdin into an argument.
|
||||
For example, if we have a list of files called `list.txt' then we could use cat as so:
|
||||
|
||||
```bash
|
||||
```sh
|
||||
cat list.txt | xargs rm
|
||||
```
|
||||
|
||||
@@ -81,13 +81,13 @@ x=$(( x*x ))
|
||||
|
||||
## Finding Duplicate Files
|
||||
|
||||
```bash
|
||||
```sh
|
||||
find . -type f -exec md5sum '{}' ';' | sort | uniq --all-repeated=separate -w 15 > all-files.txt
|
||||
```
|
||||
|
||||
## Output random characters
|
||||
|
||||
```bash
|
||||
```sh
|
||||
cat /dev/urandom | tr -cd [:alnum:] | dd bs=1 count=200 status=none && echo
|
||||
```
|
||||
|
||||
@@ -95,13 +95,13 @@ cat /dev/urandom | tr -cd [:alnum:] | dd bs=1 count=200 status=none && echo
|
||||
|
||||
Try something out in a random directory in `/tmp` so the files will be deleted when you next shut down.
|
||||
|
||||
```bash
|
||||
```sh
|
||||
mktemp -d
|
||||
```
|
||||
|
||||
That gives you a random directory to mess about in.
|
||||
|
||||
```bash
|
||||
```sh
|
||||
dir=$(mktemp -d)
|
||||
for x in {A..Z}; do
|
||||
fortune > "$dir"/chimpan-$x
|
||||
|
@@ -1 +0,0 @@
|
||||
../basics/cron.md
|
129
system/cron.md
Normal file
129
system/cron.md
Normal file
@@ -0,0 +1,129 @@
|
||||
---
|
||||
title: "cron"
|
||||
tags: [ "basics", "time" ]
|
||||
---
|
||||
# Cronie
|
||||
|
||||
The `cronie` program is also known as `crond`.
|
||||
|
||||
## Install
|
||||
|
||||
```sh
|
||||
sudo apt search -n ^cron
|
||||
```
|
||||
|
||||
Once installed, search for the service name, and start it.
|
||||
|
||||
```sh
|
||||
sudo systemctl list-unit-files | grep cron
|
||||
sudo systemctl enable --now $NAME
|
||||
```
|
||||
|
||||
## Usage
|
||||
|
||||
Show your current crontab:
|
||||
|
||||
```sh
|
||||
crontab -l
|
||||
```
|
||||
|
||||
You can put this in a file and edit it:
|
||||
|
||||
```sh
|
||||
crontab -l > $filename
|
||||
echo '39 3 */3 * * /bin/tar czf /tmp/etc_backup.tgz /etc/' >> $filename
|
||||
```
|
||||
|
||||
Then apply that crontab:
|
||||
|
||||
```sh
|
||||
crontab $filename
|
||||
rm $filename
|
||||
```
|
||||
|
||||
The `cron` program will check your syntax before adding the tab.
|
||||
|
||||
Your crontab file sits somewhere in `/var/spool/`.
|
||||
Probably in `/var/spool/cron`.
|
||||
|
||||
## Syntax
|
||||
|
||||
`* * * * *`
|
||||
|
||||
These five points refer to:
|
||||
|
||||
`minute hour day month weekday`
|
||||
|
||||
So '3pm every Sunday' would be:
|
||||
|
||||
`0 15 * * 7`
|
||||
|
||||
Here 'Sunday' is indicated by "7", and '3pm' is 'the 15th hour'.
|
||||
The minute is '0' (i.e. '0 minutes past three pm').
|
||||
|
||||
Doing the same thing, but only in February, would be:
|
||||
|
||||
`0 15 * 2 7`
|
||||
|
||||
### Variables
|
||||
|
||||
`cronie` doesn't know where you live, so to put something in your `$HOME` directory, you have to tell it:
|
||||
|
||||
|
||||
```sh
|
||||
echo "HOME=$HOME" > $filename
|
||||
crontab -l >> $filename
|
||||
crontab $filename
|
||||
```
|
||||
|
||||
`cronie` doesn't know where anything lives, including programs.
|
||||
You can give it your usual `$PATH` variable like this:
|
||||
|
||||
|
||||
```sh
|
||||
echo $PATH > $filename
|
||||
crontab -l >> $filename
|
||||
crontab $filename
|
||||
```
|
||||
|
||||
Now instead of doing this
|
||||
|
||||
`40 */3 * * * /usr/bin/du -sh $HOME/* | sort -h > $HOME/sum.txt`
|
||||
|
||||
You can simply do this:
|
||||
|
||||
`40 */3 * * * du -sh $HOME/* | sort -h > $HOME/sum.txt`
|
||||
|
||||
## Run as Root
|
||||
|
||||
You can execute a script as root by putting it into a directory, instead of in the tab.
|
||||
Look at the available cron directories:
|
||||
|
||||
```sh
|
||||
ls -d /etc/cron.*
|
||||
```
|
||||
|
||||
Make a script which runs daily:
|
||||
|
||||
```sh
|
||||
f=apt_update.sh
|
||||
echo '#!/bin/bash' > $f
|
||||
echo 'apt update --yes' >> $f
|
||||
chmod +x $f
|
||||
sudo mv $f /etc/cron.daily/
|
||||
```
|
||||
|
||||
### Testing with runparts
|
||||
|
||||
Run-parts runs all executable scripts in a directory.
|
||||
|
||||
```sh
|
||||
run-parts /etc/cron.hourly
|
||||
```
|
||||
|
||||
# Troubleshooting
|
||||
|
||||
### `date` Commands
|
||||
|
||||
Cron doesn't understand the `%` sign, so if you want to use `date +%R`, then it should be escaped with a backslash: `date +\%R`.
|
||||
|
@@ -7,13 +7,13 @@ tags: [ "system", "deduplicate", "maintenance", "storage" ]
|
||||
|
||||
Ask if a directory has duplicates (`rdfind` will not delete anything):
|
||||
|
||||
```bash
|
||||
```sh
|
||||
rdfind $dir
|
||||
$EDITOR results.txt
|
||||
```
|
||||
|
||||
Replace the duplicated files with [hard links](../basics/hard_links.md).
|
||||
|
||||
```bash
|
||||
```sh
|
||||
rdfind -makehardlinks true $dir
|
||||
```
|
||||
|
@@ -9,19 +9,19 @@ Install the package `xdg-utils`, then make very liberal use of the tab button.
|
||||
|
||||
Ask what type of application opens an mkv file:
|
||||
|
||||
```bash
|
||||
```sh
|
||||
xdg-mime query default video/mkv
|
||||
```
|
||||
|
||||
Same with pdf:
|
||||
|
||||
```bash
|
||||
```sh
|
||||
xdg-mime query default application/pdf
|
||||
```
|
||||
|
||||
Ask what file-type `book.pdf` uses.
|
||||
|
||||
```bash
|
||||
```sh
|
||||
xdg-mime query filetype *book.pdf*
|
||||
```
|
||||
|
||||
@@ -29,7 +29,7 @@ xdg-mime query filetype *book.pdf*
|
||||
|
||||
Set the mime type of mp4 videos to mpv.
|
||||
|
||||
```bash
|
||||
```sh
|
||||
xdg-mime default mpv.desktop video/mp4
|
||||
```
|
||||
|
||||
@@ -37,7 +37,7 @@ You'll need to use the tab key a lot here, and remember many items start with `o
|
||||
|
||||
You can use an asterisk for everything in a category.
|
||||
|
||||
```bash
|
||||
```sh
|
||||
xdg-mime default org.gnome.font-viewer.desktop font/\*
|
||||
```
|
||||
|
||||
|
12
system/lf.md
12
system/lf.md
@@ -7,25 +7,25 @@ tags: [ "file browser", "TUI" ]
|
||||
|
||||
If you don't have a `~/.config/lf/lfrc` file, you can probably find an example in `/usr/share/examples/lf`.
|
||||
|
||||
```bash
|
||||
```sh
|
||||
cp -r /usr/share/examples/lf ~/.config/
|
||||
```
|
||||
|
||||
Go straight to root with two keys.
|
||||
|
||||
```bash
|
||||
```sh
|
||||
map g/ cd /
|
||||
```
|
||||
|
||||
Have lf open a file with the default program when you press 'o', using the program `mimeo`.
|
||||
|
||||
```bash
|
||||
```sh
|
||||
map o &mimeo $f
|
||||
```
|
||||
|
||||
Change that default text editor to look at the extension first.
|
||||
|
||||
```bash
|
||||
```sh
|
||||
cmd open ${{
|
||||
case $(file --mime-type $f -b) in
|
||||
application/x-sc) sc-im $fx;;
|
||||
@@ -52,7 +52,7 @@ That leaves it as a small initial pane, a medium pane, and a large pane for file
|
||||
The standard renaming is bad, because you have to re-type the file extension.
|
||||
Use this instead:
|
||||
|
||||
```bash
|
||||
```sh
|
||||
# rename current file without overwrite
|
||||
cmd rename %echo 'name: ' ; read name ; extension="${f##*.}" && newname="$name.$extension"; [ "$f" = "$extension" ] && newname="$name"; [ ! -e "$newname" ] && mv "$f" "$newname" || echo file exists
|
||||
map r push :rename<enter>
|
||||
@@ -65,7 +65,7 @@ If you try to rename `image_1.png` with this command, you can type in `cats`, an
|
||||
First, install `ueberzug` (to show images).
|
||||
Then clone the lfrun repo.
|
||||
|
||||
```bash
|
||||
```sh
|
||||
git clone https://github.com/cirala/lfimg.git
|
||||
|
||||
cd lfimg
|
||||
|
@@ -7,7 +7,7 @@ If you have `graph-easy` (often in the package `perl-graph-easy` or similar), yo
|
||||
|
||||
Start with the command to 'make all targets' (`-B`), and 'do a dummy run' (`-n`) with debug into (`-d`):
|
||||
|
||||
```bash
|
||||
```sh
|
||||
make -Bnd
|
||||
make -Bnd | make2graph
|
||||
make -Bnd | make2graph | graph-easy --boxart
|
||||
|
@@ -7,7 +7,7 @@ tags: [ "RAID", "disk" ]
|
||||
You will need 4 disks and the `mdadm` package.
|
||||
The total size will be equal to the disks x 3, because one will be used for redundancy.
|
||||
|
||||
```bash
|
||||
```sh
|
||||
sudo mdadm --create --verbose /dev/*md127* --level=5 --raid-devices=*4* */dev/sdb /dev/sdc /dev/sdd /dev/sde*
|
||||
```
|
||||
|
||||
@@ -19,7 +19,7 @@ Note the variable parts:
|
||||
|
||||
Now look at how the raid status:
|
||||
|
||||
```bash
|
||||
```sh
|
||||
cat /proc/mdstat
|
||||
```
|
||||
|
||||
@@ -27,7 +27,7 @@ This will increase until the entire thing is fine.
|
||||
|
||||
Check the health of your `mdadm` array:
|
||||
|
||||
```bash
|
||||
```sh
|
||||
sudo mdadm --detail /dev/md127
|
||||
```
|
||||
|
||||
@@ -35,7 +35,7 @@ You should see `State : clean`. If you see it is `degraded`, then a disk has bro
|
||||
|
||||
## Replacing a Disk
|
||||
|
||||
```bash
|
||||
```sh
|
||||
sudo mdadm --add /dev/md127 /dev/sdb1
|
||||
```
|
||||
|
||||
|
@@ -5,26 +5,26 @@ tags: [ "system", "CPU", "memory" ]
|
||||
|
||||
Print the average CPU load over 1 minute, 5 minutes, and 15 minutes:
|
||||
|
||||
```bash
|
||||
```sh
|
||||
watch -d cat /proc/loadavg
|
||||
stress="$(cat /proc/loadavg | awk '{print "Usage:" $2"%"}')"
|
||||
```
|
||||
|
||||
Show memory usage in Gibitytes.
|
||||
|
||||
```bash
|
||||
```sh
|
||||
free -g
|
||||
```
|
||||
|
||||
Show low and high gigibtye usage on a *l*ine, and repeat the measurement every 5 seconds:
|
||||
|
||||
```bash
|
||||
```sh
|
||||
REP=5
|
||||
free --lohi -g -s $REP | lolcat
|
||||
```
|
||||
|
||||
Check the next thing cron will do:
|
||||
|
||||
```bash
|
||||
```sh
|
||||
cronnext /var/spool/cron/$USER -l
|
||||
```
|
||||
|
@@ -6,38 +6,38 @@ tags: [ "systemd" ]
|
||||
See a running log of all system messages:
|
||||
|
||||
|
||||
```bash
|
||||
```sh
|
||||
journalctl -f
|
||||
```
|
||||
|
||||
Or just one user:
|
||||
|
||||
```bash
|
||||
```sh
|
||||
journalctl --user -f
|
||||
```
|
||||
|
||||
Or just one unit (`sshd`):
|
||||
|
||||
```bash
|
||||
```sh
|
||||
journalctl -f -u sshd
|
||||
```
|
||||
|
||||
Find errors since November
|
||||
|
||||
```bash
|
||||
```sh
|
||||
journalctl --since=2018-11-01 --grep="EXT4-fs error"
|
||||
```
|
||||
|
||||
Limit size to 2G.
|
||||
|
||||
```bash
|
||||
```sh
|
||||
journalctl --vacuum-size=2G
|
||||
```
|
||||
|
||||
Log the fact that you've installed your own `dnsmasq` on your system to `journalctl`, so that you can notice why your system's broken:
|
||||
|
||||
|
||||
```bash
|
||||
```sh
|
||||
logger "Installed new dnsmasq"
|
||||
sudo journalctl -f
|
||||
```
|
||||
|
@@ -26,7 +26,7 @@ WantedBy=multi-user.target
|
||||
|
||||
After making the new service, systemd requires reloading:
|
||||
|
||||
```bash
|
||||
```sh
|
||||
sudo systemctl daemon-reload
|
||||
```
|
||||
|
||||
|
@@ -2,33 +2,33 @@
|
||||
title: "systemd"
|
||||
tags: [ "systemd" ]
|
||||
---
|
||||
```bash
|
||||
```sh
|
||||
systemctl list-units
|
||||
```
|
||||
|
||||
```bash
|
||||
```sh
|
||||
sudo systemctl status mpd
|
||||
```
|
||||
|
||||
```bash
|
||||
```sh
|
||||
sudo systemctl daemon-reload
|
||||
```
|
||||
|
||||
```bash
|
||||
```sh
|
||||
sudo systemctl taskd.service start
|
||||
```
|
||||
|
||||
```bash
|
||||
```sh
|
||||
sudo systemctl status taskd.service
|
||||
```
|
||||
|
||||
# Startup
|
||||
|
||||
```bash
|
||||
```sh
|
||||
sudo systemd-analyze
|
||||
```
|
||||
|
||||
```bash
|
||||
```sh
|
||||
sudo systemd-analyze blame
|
||||
```
|
||||
|
||||
|
Reference in New Issue
Block a user